使用Kwargs时可以跳过Python中的参数吗

时间:2019-02-14 00:55:22

标签: python function dictionary parameters kwargs

我有一个接收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" ])

如果密钥不存在,我可以将其断开。

2 个答案:

答案 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(),因为解释器会造成混淆)。再次,不要这样做。