2013-10-31 13 views
5

Trong Python, nếu bạn có một cuốn từ điểnLàm cách nào để áp dụng tên được đặt lên một hàm?

d = {'foo': 1, 'bar': False} 

Bạn có thể áp dụng điều này vào một chức năng mà chấp nhận foobar đối số từ khóa bằng

def func(foo, bar): 
    # Do something complicated here 
    pass 

func(**d) 

Nhưng nếu thay vào đó, tôi muốn gọi func với namedtuple được định nghĩa bên dưới:

Cú pháp cho điều này là gì?

+0

Ý của bạn là 'func (* r) 'trong khối mã cuối cùng? – mr2ert

+0

Bạn đã thử sử dụng 'func (* d)' chưa? Đó là, cố gắng sử dụng nó như là một varargs và không phải là một dict? – wheaties

+0

mr2ert, viết như một câu trả lời và tôi sẽ chấp nhận nó. Thử nghiệm nhỏ cho thấy rằng chúng thực sự khớp với từ khóa. – fatuhoku

Trả lời

10

Một ví dụ namedtuple có ._asdict() method:

func(**r._asdict()) 

nhưng nếu các thuộc tính namedtuple là theo thứ tự giống như các đối số của hàm, bạn chỉ có thể áp dụng nó như là một chuỗi thay vì:

func(*r) 

Ở đây, hai giá trị của tên tệp được áp dụng, theo thứ tự, với đối số từ khóa trong hàm. Hai đối số này có thể được giải quyết như là các đối số vị trí, sau khi tất cả!

Đối với chức năng mẫu của bạn, cả hai công việc:

>>> def func(foo, bar): 
...  print foo, bar 
... 
>>> from collections import namedtuple 
>>> Record = namedtuple('Record', 'foo bar') 
>>> r = Record(foo=1, bar=False) 
>>> func(**r._asdict()) 
1 False 
>>> func(*r) 
1 False 
+0

Bạn có thể muốn bao gồm số đối số cũng phải giống nhau. – thefourtheye

+0

@thefourtheye: điều đó cũng áp dụng cho trường hợp từ điển được áp dụng-như-từ khóa-arg; đó không phải là đặc biệt với tên gọi. –

+0

Vâng. Bạn đúng rồi. – thefourtheye

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