2011-01-01 40 views
16

Giả sử tôi có hàm python có hai đối số, nhưng tôi muốn tham số thứ hai là tùy chọn, với mặc định là bất kỳ thứ gì được chuyển làm đối số đầu tiên. Vì vậy, tôi muốn làm một cái gì đó như thế này:Trong Python, tôi có thể chỉ định mặc định đối số của hàm về các đối số khác không?

def myfunc(arg1, arg2=arg1): 
    print (arg1, arg2) 

Ngoại trừ việc đó không hoạt động. Cách giải quyết duy nhất tôi có thể nghĩ đến là:

def myfunc(arg1, arg2=None): 
    if arg2 is None: 
     arg2 = arg1 
    print (arg1, arg2) 

Có cách nào tốt hơn để thực hiện việc này không?

+0

Tôi chỉ xem xét lại điều này, có thể đạt được với trình trang trí. Nó sẽ không rõ ràng những gì nó làm ở cái nhìn đầu tiên vì vậy có lẽ là một ý tưởng tồi, nhưng đó là một ý tưởng. – marcog

Trả lời

17

Như @Ignacio nói, bạn không thể làm điều này. Trong ví dụ sau, bạn có thể có một tình huống trong đó None là một giá trị hợp lệ cho arg2. Nếu trường hợp này xảy ra, bạn có thể sử dụng giá trị sentinel:

sentinel = object() 
def myfunc(arg1, arg2=sentinel): 
    if arg2 is sentinel: 
     arg2 = arg1 
    print (arg1, arg2) 

myfunc("foo")   # Prints 'foo foo' 
myfunc("foo", None)  # Prints 'foo None' 
+2

@martineau Cảm ơn bạn đã chỉnh sửa, điểm đẹp! – marcog

+2

Không sao cả - câu trả lời xuất sắc, BTW. – martineau

+0

có lẽ tốt hơn để chỉ mặc định arg2 để Không và kiểm tra xem thay vì làm phiền với một đối tượng sentinel tùy chỉnh trừ khi bạn cần phải xử lý người dùng được cung cấp Không khác với mặc định – user234461

3

Không thực sự. Các tên đối số khác không tồn tại cho đến khi hàm được nhập thực sự.

+0

Nhưng bạn có thể dọn dẹp nó lên một chút bằng cách thay đổi mệnh đề 'if' trong giải pháp thay thế thành:' arg2 = arg2 hoặc arg1' –

+1

@Michael Điều đó sẽ thất bại nếu 'arg2' là' 0', 'Sai' hoặc một chuỗi rỗng. – marcog

3

Cách thứ hai là tốt trong quan điểm của tôi: đó là chính xác rõ ràng những gì bạn làm, và cho tất cả những người sẽ đến sau khi bạn và đọc mã. Trong khi có một chi phí nhỏ trong việc ghi lại hành vi mặc định, việc sử dụng 'Không có' hoặc bất kỳ hành vi nào khác để làm cho hàm của bạn tạo ra một giá trị mặc định là rất phổ biến. Đặt logic bên trong các cuộc gọi hàm chắc chắn sẽ không được khen ngợi theo ý kiến ​​của tôi, nó có thể trở nên rất phức tạp rất sớm. Vì vậy, chỉ cần để nó trong cơ thể chức năng, nơi tất cả các mã được.

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