5
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")

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

4

4 回答 4

8

你可以使用kwargs

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'}

使用这种语法,Python 无需显式指定任何参数列表,并允许函数处理它们想要的任何旧关键字参数。

如果您专门寻找键var1等而不是varone只修改函数调用:

>>> function(var1=None, var2="fish", var3=None)
{'var2': 'fish'}

如果你想变得非常漂亮,你可以使用列表推导:

def function(**kwargs):
    values = dict([i for i in kwargs.iteritems() if i[1] != None])
    if not values:
        raise Exception("foo")
    return values

同样,您必须更改参数名称以与输出键一致。

于 2012-10-27T06:23:50.340 回答
4

使用**kwargs. 例子:

def function(**kwargs):
    if not kwargs:
        raise Exception("No values provided")
    for k, v in kwargs.items():
        print("%s: %r") % (k, v)

如果你真的要functionNone参数调用,你可以去掉它们:

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)

显然,您可以改为调用 dict values,但kwargs它是传统名称,并且会使您的代码对其他人更容易理解。

于 2012-10-27T06:23:57.750 回答
2

好吧,您可以在 a 中传递所有这些值keyword argument:-

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)

输出: -

No values
{'varOne': 123}
{'varOne': 123, 'varTwo': 234}
于 2012-10-27T06:23:21.383 回答
1

像往常一样调用你的函数,但接受**kwargs. 然后过滤它们:

def fn(**kwargs):
    items = {'var%s' % i: v for i, (k, v) in enumerate(items)}

fn(a=1, b=2, c=3)

如果您需要一组特定的名称,请制作一个名称字典:

    names = dict(zip('varOne varTwo varThree'.split(), range(1, 4)))

走过这个 dict 并检查 var 是否在 kwargs 中:

items = {'var%s' % k: kwargs[v] for k, v in names.items() if v in kwargs}
于 2012-10-27T06:47:32.980 回答