Python, đối số từ khóa mặc định sau đối số vị trí có độ dài thay đổi


81

Tôi nghĩ rằng tôi có thể sử dụng các tham số được đặt tên sau các tham số vị trí có độ dài thay đổi trong một lệnh gọi hàm trong Python 2, nhưng tôi nhận được SyntaxErrorkhi nhập một lớp python. Tôi đang viết với phương thức "get" sau, ví dụ:

class Foo(object):
    def __init__(self):
        print "You have created a Foo."

    def get(self, *args, raw=False, vars=None):
        print len(args)
        print raw
        print vars

Lỗi trông giống như:

def get(self, *args, raw=False, vars=None):
                     ^
SyntaxError: invalid syntax

Tôi muốn có thể gọi phương thức theo một số cách:

f = Foo()
f.get(arg1, arg2)
f.get(arg1, raw=True)
f.get(arg1, arg2, raw=True, vars=something)

Vân vân.

Câu trả lời:


70

Nó hoạt động, nhưng chỉ trong Python 3. Xem PEP 3102 . Từ việc lướt qua các tài liệu "có gì mới", có vẻ như không có cổng hỗ trợ 2.x nào, vì vậy bạn không may mắn. Bạn sẽ phải chấp nhận bất kỳ đối số từ khóa nào ( **kwargs) và phân tích cú pháp nó theo cách thủ công. Bạn có thể sử dụng d.get(k, default)để lấy d[k]hoặc defaultnếu không có. Để loại bỏ một đối số khỏi kwargs, ví dụ: trước khi gọi một phương thức siêu lớp ', hãy sử dụng d.pop.


Lưu ý rằng trong def get(self, *args, raw=False, vars=None):, raw=Falsevars=Nonekhông liên quan gì đến các đối số từ khóa. Đó là các giá trị đối số mặc định. Các đối số có giá trị mặc định có thể được chuyển theo vị trí và các đối số không có giá trị mặc định có thể được chuyển bằng từ khóa:

def f(a=1): pass
f(2)  # works, passing a positionally
def f(a): pass
f(a=2)  # works, passing a by keyword

Tương tự, các đối số chỉ từ khóa không bắt buộc phải có giá trị mặc định. Đứng sau *argsđối số là thứ đánh dấu chúng là chỉ từ khóa, không phải là sự hiện diện của giá trị mặc định:

def f(*args, a): pass
# a is a mandatory, keyword-only argument

Cảm ơn cả bạn và Imran! Câu trả lời của bạn với khối mã của Imran và gợi ý chuỗi doc đã trả lời câu hỏi một cách hoàn hảo.
jkmacc

50

Cú pháp của Python không cho phép các hàm biến trong đối số hàm và từ khóa có giá trị mặc định cùng một lúc. Nếu bạn phải có đối số từ khóa cùng với số lượng đối số vị trí tùy ý, bạn cũng cần cho phép số đối số từ khóa tùy ý.

Đây là một mẫu phổ biến để cung cấp giá trị mặc định cho các đối số từ khóa, cũng như cho phép bất kỳ số lượng đối số vị trí nào:

def foo(*args, **kwargs):
   raw = kwargs.pop('raw', False)
   vars = kwargs.pop('vars', None)

Nếu bạn hoàn toàn không sử dụng các đối số từ khóa bổ sung, bạn không có gì phải lo lắng. Điều này làm cho hàm ít tự lập tài liệu hơn một chút, mà bạn có thể tạo ra bằng một chuỗi tài liệu được viết đúng cách.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.