2013-06-17 47 views
6

Ví dụ, tôi có một phương thức cơ bản sẽ trả về danh sách hoán vị.Có cách nào để đặt tham số mặc định bằng một giá trị tham số khác không?

import itertools 
def perms(elements,setLength=elements): 
    data=[] 
    for x in range(elements): 
     data.append(x+1) 
    return(list(itertools.permutations(data,setLength))) 

Bây giờ tôi hiểu rằng trong tình trạng như hiện nay mã này sẽ không chạy vì thứ hai elements không được định nghĩa, nhưng là ở đó và cách thanh lịch để hoàn thành những gì tôi đang cố gắng để làm ở đây? Nếu vẫn chưa rõ, tôi muốn đặt giá trị mặc định là setLength bằng đối số đầu tiên được chuyển. Thanks.

+0

Nó có vẻ như 3 người đồng ý về giải pháp. Ngoài ra, hãy xem "Cảnh báo quan trọng" trên http://docs.python.org/3/tutorial/controlflow.html#default-argument-values – Josay

Trả lời

14

Không, mặc định tham số từ khóa chức năng được xác định khi hàm được xác định, không phải khi chức năng được thực thi.

Đặt mặc định để None và phát hiện rằng:

def perms(elements, setLength=None): 
    if setLength is None: 
     setLength = elements 

Nếu bạn cần để có thể xác định None như một cuộc tranh luận, sử dụng một giá trị trọng điểm khác nhau:

_sentinel = object() 

def perms(elements, setLength=_sentinel): 
    if setLength is _sentinel: 
     setLength = elements 

Bây giờ người gọi có thể thiết lập setLength đến None và nó sẽ không được xem là mặc định.

4

Do cách Python xử lý ràng buộc và các thông số mặc định ...

Cách thông thường là:

def perms(elements, setLength=None): 
    if setLength is None: 
     setLength = elements 

Và tùy chọn khác là:

def perms(elements, **kwargs): 
    setLength = kwargs.pop('setLength', elements) 

Mặc dù điều này đòi hỏi bạn phải sử dụng rõ ràng perms(elements, setLength='something else') nếu bạn không muốn mặc định ...

4

Bạn nên làm điều gì đó như:

def perms(elements,setLength=None): 
    if setLength is None: 
     setLength = elements 
Các vấn đề liên quan