我有一个接受kwargs的函数。我希望按名称使用kwargs参数,而不必将每个参数显式声明为参数或变量。有没有办法通过传入kwargs而不必在函数调用中专门定义它来使用my_var_key
,或者是使用kwargs[ "my_var_key" ]
的唯一方法?
例如。我想要类似的东西
def func(**kwargs):
print(my_var_key)
而不是
def func(my_var_key, **kwargs):
print(my_var_key)
要么
def func(**kwargs):
print(kwargs[ "my_var_key" ])
如果钥匙不存在,我可以打破它。
不要这样做。它使您的代码更难阅读。
但如果你坚持,尝试修改你的globals()
范围:
def func(**kwargs):
for key, val in kwargs.items():
globals()[key] = val
print(globals())
print(my_var_key)
func(my_var_key='foobar')
输出是:
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x10f058f28>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'test.py', '__cached__': None, 'func': <function func at 0x10ef52268>, 'my_var_key': 'foobar'}
foobar
这肯定会污染你的全局命名空间(你不能使用locals()
,因为解释器会混淆)。再说一次,不要这样做。
不,没有实用的方法来获得您想要的语法。
Python's design philosophy的一部分是“显式优于隐式”,因此在没有输入的情况下,名称将被添加到命名空间的情况并不多。如果你想将my_var_key
作为参数传递给函数的命名空间,你应该在def
语句中命名它。如果您希望它只能作为关键字参数(而不是位置参数)传递,则可以在参数列表中放置*
:
def func(*, my_var_key): # arg can only be passed as a keyword: func(my_var_key=1)
...