Vượt qua một danh sách kwargs?


95

Tôi có thể chuyển danh sách kwargs cho một phương thức cho ngắn gọn không? Đây là những gì tôi đang cố gắng làm:

def method(**kwargs):
    #do something

keywords = (keyword1 = 'foo', keyword2 = 'bar')
method(keywords)

2
Tôi đang cố gắng chuyển kwargs từ chức năng này sang kwargs của chức năng khác. Câu hỏi tuyệt vời!
Benj

Câu trả lời:


160

Đúng. Bạn làm như thế này:

def method(**kwargs):
  print kwargs

keywords = {'keyword1': 'foo', 'keyword2': 'bar'}
method(keyword1='foo', keyword2='bar')
method(**keywords)

Chạy điều này trong Python xác nhận rằng những điều này tạo ra các kết quả giống hệt nhau:

{'keyword2': 'bar', 'keyword1': 'foo'}
{'keyword2': 'bar', 'keyword1': 'foo'}

10
Hoặc: keywords = dict (keyword1 = 'foo', keyword2 = 'bar')
Ned Deily 30/09/09

1
Các **nhà điều hành giải nén có thể được sử dụng để truyền kwargs từ một chức năng để kwargs của chức năng khác. Hãy xem xét mã này: (dòng mới dường như không được phép trong nhận xét) def a(**kw): print(kw)def b(**kw): a(kw). Mã này sẽ tạo ra lỗi vì kwargs thực sự là một từ điển và sẽ được hiểu như một đối số thông thường của dictkiểu. Đó là lý do tại sao việc thay đổi def b(**kw): a(kw)thành def b(**kw): a(**kw)sẽ giải nén kwvà giải quyết các lỗi.
Benj

10

Như những người khác đã chỉ ra, bạn có thể làm những gì bạn muốn bằng cách chuyển một câu lệnh. Có nhiều cách khác nhau để xây dựng một chính tả. Một cách duy trì keyword=valuephong cách bạn đã cố gắng là sử dụng dict tích hợp sẵn:

keywords = dict(keyword1 = 'foo', keyword2 = 'bar')

Lưu ý tính linh hoạt của dict; tất cả đều tạo ra cùng một kết quả:

>>> kw1 = dict(keyword1 = 'foo', keyword2 = 'bar')
>>> kw2 = dict({'keyword1':'foo', 'keyword2':'bar'})
>>> kw3 = dict([['keyword1', 'foo'], ['keyword2', 'bar']])
>>> kw4 = dict(zip(('keyword1', 'keyword2'), ('foo', 'bar')))
>>> assert kw1 == kw2 == kw3 == kw4
>>> 

4

Bạn có nghĩa là một mệnh lệnh? Chắc chắn bạn có thể:

def method(**kwargs):
    #do something

keywords = {keyword1: 'foo', keyword2: 'bar'}
method(**keywords)

à, tôi đã không chú ý. Nên tốt hơn bây giờ.
David Z

3

Vì vậy, khi tôi đến đây, tôi đang tìm cách chuyển một số ** kwargs trong một hàm - để sử dụng sau này cho các hàm khác. Bởi vì điều này, không có gì đáng ngạc nhiên, không hoạt động:

def func1(**f2_x, **f3_x):
     ...

Với một số mã hóa 'thử nghiệm' của riêng mình, tôi đã tìm ra cách rõ ràng để làm điều đó:

def func3(f3_a, f3_b):
    print "--func3--"
    print f3_a
    print f3_b
def func2(f2_a, f2_b):
    print "--func2--"
    print f2_a
    print f2_b

def func1(f1_a, f1_b, f2_x={},f3_x={}):
    print "--func1--"
    print f1_a
    print f1_b
    func2(**f2_x)
    func3(**f3_x)

func1('aaaa', 'bbbb', {'f2_a':1, 'f2_b':2}, {'f3_a':37, 'f3_b':69})

Bản in này như mong đợi:

--func1--
aaaa
bbbb
--func2--
1
2
--func3--
37
69

6
Tính đến python 3.5các Foo(**arg1, **arg2)thể
magu_
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.