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

null以外の名前の変数を配置し、それらを辞書に配置することを実現するための、より洗練された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)

values明らかに、代わりにdictを呼び出すこともできますが、これkwargsは従来の名前であり、コードを他の人にとってよりわかりやすくします。

于 2012-10-27T06:23:57.750 に答える
2

さて、あなたはこれらすべての値を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 に答える