2012-01-17 57 views
8

Vui lòng xem xét chức năng đơn giản:Chức năng với các đối số cài sẵn phụ thuộc

def fun(x, y, param1=10, param2=param1/3): 
    do something 

đâu param1param2 không nên được yêu cầu nhưng có thể được thiết lập bởi người sử dụng. Nếu param2 không được đặt, giá trị phụ thuộc vào param1 theo một cách nào đó.

Ví dụ ở trên sẽ nâng cao NameError: name 'param1' is not defined

Có cách nào để làm điều này loại phân bằng Python?

Trả lời

12

Một cách là để bắt chước này bên trong hàm:

def fun(x, y, param1=10, param2=None): 
    if param2 is None: 
     param2 = param1/3 
    # do something 

Nếu param2=None là một đầu vào hợp lệ vào fun(), sau đây có thể là một lựa chọn tốt hơn:

default = object() 

def fun(x, y, param1=10, param2=default): 
    if param2 is default: 
     param2 = param1/3 
    # do something 

(Đã được xem xét ví dụ thứ hai này trong một vài phút, tôi thực sự khá giống cú pháp is default.)

Lý do orig Phiên bản nội bộ không hoạt động là các giá trị mặc định được tính toán và giới hạn ở thời gian định nghĩa hàm. Điều này có nghĩa là bạn không thể có mặc định phụ thuộc vào thứ gì đó không được biết cho đến khi hàm được gọi (trong trường hợp của bạn, giá trị là param1).

+2

'mặc định' có thể gây hiểu lầm,' not_set' có thể là tên tốt hơn. Nó không rõ ràng (với tôi) trong nháy mắt rằng 'mặc định' không phải là giá trị mặc định chính nó nhưng một giữ chỗ báo hiệu rằng một giá trị mặc định cho' param2' nên được sử dụng. – jfs

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