2009-05-15 43 views

Trả lời

14

Hãy thử điều này:

def foo(self, blah=None): 
    if blah is None: # faster than blah == None - thanks to kcwu 
     blah = self.instance_var 
+0

Hoàn hảo, cảm ơn! –

+4

sử dụng "là" để so sánh Không có gì tốt hơn (và nhanh hơn) – kcwu

+0

@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

2

không, vì dụ không tồn tại khi lớp nghĩa hàm thời gian

Bạn cần phải viết lại như sau

def function(self, arg1=val1, arg2=val2, arg3=None): 
    if arg3 is None: 
     arg3 = self.instance_var 

này là hơi khác nhau để bản gốc: bạn không thể chuyển arg3 với None nếu bạn thực sự muốn.

giải pháp thay thế:

def function(self, arg1=val1, arg2=val2, **argd): 
    arg3 = argd.get('arg3', self.instance_var) 
-1

Một cách khác để làm điều này sẽ là:

def foo(self, blah=None): 
    blah = blah or self.instance_var 

phiên bản ngắn này trông tốt hơn, đặc biệt khi có nhiều hơn một đối số tùy chọn.

Sử dụng cẩn thận. Xem các nhận xét bên dưới ...

+0

hãy cẩn thận nếu blah == 0 – kcwu

+0

hoặc False hoặc một mảng trống ... ngắn: không làm điều đó –

+0

như những người bình luận khác chỉ ra, đây không thực sự là Pythonic, vì nó có tác dụng không mong muốn. –

5

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.

0
def foo(self, blah=None): 
    blah = blah if not blah is None else self.instance_var 

Điều này làm việc với trăn 2.5 và chuyển tiếp và xử lý các trường hợp blah là chuỗi trống, danh sách, v.v.

Các vấn đề liên quan