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)
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)
Câu trả lời:
Đú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'}
**
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)
và 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 dict
kiể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 kw
và giải quyết các lỗi.
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=value
phong 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
>>>
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
python 3.5
các Foo(**arg1, **arg2)
thể