从参数中选择所有非None元素并将它们放在python字典中的优雅方式是什么?

从参数中选择所有非None元素并将它们放在python字典中的优雅方式是什么?,python,Python,有人能推荐一种更优雅的python方法来完成放置非空命名变量并将它们放入字典中吗?我不希望这些值作为字典传入。“值”的键名称很重要,必须保持原样。“varone”的值必须进入var1,“vartwo”必须进入var2,依此类推;谢谢。那么,您可以在关键字参数中传递所有这些值:- def function(varone=None, vartwo=None, varthree=None): values = {} if var1 is not None:

有人能推荐一种更优雅的python方法来完成放置非空命名变量并将它们放入字典中吗?我不希望这些值作为字典传入。“值”的键名称很重要,必须保持原样。“varone”的值必须进入var1,“vartwo”必须进入var2,依此类推;谢谢。

那么,您可以在
关键字参数中传递所有这些值:-

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}