Giả sử tôi có hàm get_data
có một số đối số từ khóa. Có một số cách tôi có thể làm điều nàySử dụng ** kwargs cả trong chức năng gọi và định nghĩa
def get_data(arg1, **kwargs):
print arg1, arg2, arg3, arg4
arg1 = 1
data['arg2'] = 2
data['arg3'] = 3
data['arg4'] = 4
get_data(arg1, **data)
Vì vậy, ý tưởng là để tránh gõ tên tham số trong cả hai gọi điện thoại chức năng và định nghĩa hàm. Tôi gọi hàm bằng từ điển làm đối số và các khóa của từ điển trở thành biến cục bộ của hàm và giá trị của chúng là giá trị từ điển
Tôi đã thử lỗi ở trên và nhận được số global name 'arg2' is not defined
. Tôi hiểu rằng tôi có thể thay đổi locals()
trong định nghĩa của get_data
để có được hành vi mong muốn.
Vì vậy, mã của tôi sẽ trông như thế này
def get_data(arg1, kwargs):
locals().update(kwargs)
print arg1, arg2, arg3, arg4
arg1 = 1
data['arg2'] = 2
data['arg3'] = 3
data['arg4'] = 4
get_data(arg1, data)
và nó sẽ không làm việc quá. Ngoài ra tôi không thể đạt được hành vi mà không sử dụng locals()
?
Tôi đề nghị bạn hãy kiểm tra câu hỏi này http://stackoverflow.com/questions/3394835/args-and-kwargs –
Không sửa đổi 'locals' , nó thậm chí không đảm bảo để làm việc tất cả các thời gian: http://docs.python.org/2/library/functions.html#locals – jamylak
.. tại sao bạn thậm chí sẽ làm điều đó? Nếu bạn biết arg2, arg3, arg4 luôn Nếu không, thì ngay cả khi bạn có hành vi mong muốn, ngay khi bạn tham chiếu nói 'arg4' khi' dữ liệu' không định nghĩa 'arg4', nó sẽ làm tăng một NameError, nó thậm chí sẽ không in bất kỳ dữ liệu nào, nó sẽ chỉ gây ra lỗi. – kampu