从参数中选择所有非None元素并将它们放在python字典中的优雅方式是什么?
有人能推荐一种更优雅的python方法来完成放置非空命名变量并将它们放入字典中吗?我不希望这些值作为字典传入。“值”的键名称很重要,必须保持原样。“varone”的值必须进入var1,“vartwo”必须进入var2,依此类推;谢谢。那么,您可以在从参数中选择所有非None元素并将它们放在python字典中的优雅方式是什么?,python,Python,有人能推荐一种更优雅的python方法来完成放置非空命名变量并将它们放入字典中吗?我不希望这些值作为字典传入。“值”的键名称很重要,必须保持原样。“varone”的值必须进入var1,“vartwo”必须进入var2,依此类推;谢谢。那么,您可以在关键字参数中传递所有这些值:- def function(varone=None, vartwo=None, varthree=None): values = {} if var1 is not None:
关键字参数中传递所有这些值:-
def function(varone=None, vartwo=None, varthree=None):
values = {}
if var1 is not None:
values['var1'] = varone
if var2 is not None:
values['var2'] = vartwo
if var3 is not None:
values['var3'] = varthree
if not values:
raise Exception("No values provided")
输出:-
def function(*nkwargs, **kwargs):
values = {}
for k in kwargs:
if kwargs[k] is not None:
values[k] = kwargs[k]
if not values:
raise Exception("No values")
print values
try:
function()
except Exception, e:
print e
function(varOne=123, varTwo=None)
function(varOne=123, varTwo=234)
您可以使用kwargs
:
No values
{'varOne': 123}
{'varOne': 123, 'varTwo': 234}
使用这种语法,Python不再需要显式指定任何参数列表,并允许函数处理它们想要的任何旧关键字参数
如果您专门查找键var1
etc而不是varone
,只需修改函数调用:
def function(*args, **kwargs):
values = {}
for k in kwargs:
if kwargs[k] is not None:
values[k] = kwargs[k]
if not values:
raise Exception("No values provided")
return values
>>> function(varone=None, vartwo="fish", varthree=None)
{'vartwo': 'fish'}
如果您想变得非常圆滑,可以使用列表理解:
>>> function(var1=None, var2="fish", var3=None)
{'var2': 'fish'}
同样,您必须更改参数名称以与输出键一致。使用**kwargs
。例如:
def function(**kwargs):
values = dict([i for i in kwargs.iteritems() if i[1] != None])
if not values:
raise Exception("foo")
return values
如果确实要使用None
参数调用函数
,可以将它们去掉:
def function(**kwargs):
if not kwargs:
raise Exception("No values provided")
for k, v in kwargs.items():
print("%s: %r") % (k, v)
显然,您可以调用dict值
,但是kwargs
是一个传统的名称,它会使您的代码更容易被其他人理解。像往常一样调用您的函数,但接受为**kwargs
。然后过滤它们:
def function(**kwargs):
for k, v in kwargs.items():
if v is None:
del kwargs[k]
if not kwargs:
raise Exception("No values provided")
for k, v in kwargs.items():
print("%s: %r") % (k, v)
如果您需要一组特定的姓名,请记录姓名:
def fn(**kwargs):
items = {'var%s' % i: v for i, (k, v) in enumerate(items)}
fn(a=1, b=2, c=3)
浏览此目录并检查var是否为kwargs:
names = dict(zip('varOne varTwo varThree'.split(), range(1, 4)))
您可以在函数中以*kwarg
的形式传递参数。顺便说一句,在Python中引发异常似乎有点奇怪。只需跳过打印None
s可能更干净,而不是事先将它们从字典中删除。但要以与问题中的函数相同的方式工作,如果没有非None参数,则需要引发异常…好的,您可以保留一个布尔标志,指示是否遇到(并打印)任何非
项,如果循环后没有设置标志,则引发异常。我想。。。但是最后的打印循环实际上只是为了让函数做一些事情,任何事情。实际上,我认为回答这个问题最好是这样解决的。为什么函数必须做些什么?无论如何,它已经在做一些事情,即过滤参数。我不同意这是对这个问题的更好的回答。+1对于列表理解(或者在较新版本的Python中可能是dict理解)正确。在第二个例子中,我使用列表理解。
items = {'var%s' % k: kwargs[v] for k, v in names.items() if v in kwargs}