使用Kwargs时我可以在Python中跳过参数吗?

问题描述 投票:0回答:2

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

如果钥匙不存在,我可以打破它。

python function dictionary parameters kwargs
2个回答
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(),因为解释器会混淆)。再说一次,不要这样做。


1
投票

不,没有实用的方法来获得您想要的语法。

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)
   ...
© www.soinside.com 2019 - 2024. All rights reserved.