Tất cả các phản hồi đề xuất None
là chính xác; nếu bạn muốn chắc chắn một người gọi có thể vượt qua Không như một cuộc tranh luận thường xuyên, sử dụng một đặc biệt sentinel
và thử nghiệm với is
:
class Foo(object):
__default = object()
def foo(self, blah=Foo.__default):
if blah is Foo.__default: blah = self.instavar
Mỗi cuộc gọi đến object()
làm cho một đối tượng duy nhất, chẳng hạn rằng is
sẽ không bao giờ thành công giữa nó và bất kỳ giá trị nào khác. Hai dấu gạch dưới trong __default
có nghĩa là "mạnh mẽ riêng", có nghĩa là người gọi biết rằng họ không nên cố gắng gây rối với nó (và sẽ cần một số công việc để làm như vậy, rõ ràng bắt chước tên mangling mà trình biên dịch đang làm).
Lý do bạn không thể chỉ sử dụng mã bạn đã đăng, btw, là giá trị mặc định sẽ đánh giá khi tuyên bố def
đánh giá, không muộn hơn tại thời điểm gọi; và tại thời điểm def
đánh giá, vẫn chưa có self
để từ đó biến biến mẫu.
Nguồn
2009-05-15 07:51:18
Hoàn hảo, cảm ơn! –
sử dụng "là" để so sánh Không có gì tốt hơn (và nhanh hơn) – kcwu
@kcwu cảm ơn vì đề xuất này. Tôi biết chúng khác nhau, nhưng tôi đã làm một điểm chuẩn và tìm thấy một sự khác biệt lớn về hiệu năng. – Unknown