Rất nhiều câu hỏi ở đây. Tôi thấy ít nhất hai, có thể ba:
- Pop (a, b) làm gì? / Tại sao lại có đối số thứ hai?
- Đang
*args
được sử dụng để làm gì?
Câu hỏi đầu tiên được trả lời nhỏ trong tài liệu tham khảo Thư viện chuẩn Python :
pop (phím [, mặc định])
Nếu khóa có trong từ điển, hãy xóa khóa đó và trả về giá trị của nó, nếu không thì trả về mặc định. Nếu mặc định không được cung cấp và khóa không có trong từ điển, lỗi KeyError sẽ xuất hiện.
Câu hỏi thứ hai được đề cập trong Tham khảo ngôn ngữ Python :
Nếu có dạng “* số nhận dạng”, nó sẽ được khởi tạo thành một bộ giá trị nhận bất kỳ tham số vị trí vượt quá nào, mặc định là bộ giá trị trống. Nếu có dạng “** IDfier”, nó sẽ được khởi tạo vào một từ điển mới nhận bất kỳ đối số từ khóa thừa nào, mặc định là một từ điển trống mới.
Nói cách khác, pop
hàm có ít nhất hai đối số. Hai phần đầu được gán tên self
và key
; và phần còn lại được nhồi vào một tuple được gọi là args
.
Điều gì đang xảy ra trên dòng tiếp theo khi *args
được chuyển cùng trong lệnh gọi tới self.data.pop
là nghịch đảo của điều này - bộ tuple *args
được mở rộng thành các tham số vị trí được truyền cùng. Điều này được giải thích trong Tham chiếu ngôn ngữ Python :
Nếu biểu thức cú pháp * xuất hiện trong lệnh gọi hàm, biểu thức phải đánh giá thành một chuỗi. Các phần tử từ chuỗi này được coi như thể chúng là các đối số vị trí bổ sung
Tóm lại, a.pop()
muốn linh hoạt và chấp nhận bất kỳ số lượng tham số vị trí nào, để nó có thể chuyển số lượng tham số vị trí chưa biết này vào self.data.pop()
.
Điều này mang lại cho bạn sự linh hoạt; data
xảy ra là một dict
quyền ngay bây giờ, và do đó self.data.pop()
có một hoặc hai tham số; nhưng nếu bạn thay đổi data
thành một kiểu có 19 tham số cho một cuộc gọi đến, self.data.pop()
bạn sẽ không phải thay đổi lớp nào a
cả. a.pop()
Mặc dù vậy, bạn vẫn phải thay đổi bất kỳ mã nào được gọi để vượt qua 19 tham số bắt buộc.
help(b.data.pop)
trong REPL.