我有一个接收kwarg的函数。我想按名称使用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" ])
如果密钥不存在,我可以将其断开。
答案 0 :(得分:0)
不,没有实用的方法来获取所需的语法。
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)
...
答案 1 :(得分:0)
不要这样做。它使您的代码更难阅读。
但是,如果您坚持要尝试修改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()
,因为解释器会造成混淆)。再次,不要这样做。