きれいに引数の数に応じて、スカラーやリストを返すために、Pythonの機能を取得

StackOverflow https://stackoverflow.com/questions/4029001

質問

免責事項:1があれば、私は、Pythonの2.6解決策を探しています。

私は複数の値を渡されたときに戻って、単一の値はシーケンスを単一の値を渡す、またはその戻ったときに、その関数を探しています

>>> a = foo(1)
2
>>> b, c = foo(2, 5)
>>> b
3
>>> c
6

は明確にするために、これはいくつかの関数呼び出しは、単により立派に見えるようにするための努力であります

a, = foo(1)

または

a = foo(1)[0]

今、無粋ソリューションは、これらの線に沿って何かあります:

def foo(*args):
    results = [a + 1 for a in args]
    return results if len(results) > 1 else results[0]

このフィールクリーナーになるだろう任意のシンタックスシュガー(または機能)がありますか?次のようなもの?

def foo(*args):
    return *[a + 1 for a in args]
役に立ちましたか?

解決

あなたは簡単に、リストは一つだけの要素を持っている場合は、リストから要素を返す関数scalifyを書くことができ、すなわちそれはスカラー(名前)を作成しようとします。

def scalify(l):
    return l if len(l) > 1 else l[0]

そして、あなたがそうのようなあなたの機能でそれを使用することができます:

def foo(*args):
    return scalify([a + 1 for a in args])

これは、トリックを行いますが、私はあなたがそれをしない提案者と思います。一つの理由のために、それはあなたが少なくとも二つの項目に渡さ知っている限り、結果を反復処理除外する。あなたがリストを持っている場合にも、あなたは「listness」そのを失って、関数を呼び出すときに、リストを展開する必要があり、あなたが戻ってリストを取得することはできません知っています。これらの欠点は、あなたが技術に見ることができる任意の利益を曇らせるために私には思えます。

他のヒント

:それはあなたに進歩している場合、

あなたは常にそのif文をElideのためにデコレータを書くことができます

import functools
def unpacked(method):
    @functools.wraps(method)
    def _decorator(*args):
        result = method(*args)
        return results if len(results) != 1 else results[0]
    return _decorator

使用方法:

@unpacked
def foo(*args):
    return [arg + 1 for arg in args]
あなたは、引数の数が同じタプルをしたいわけですか?これは解決策ではないですか?

return tuple([a + 1 for a in args])

def foo(*args):
    return (None, args[0]+1 if args else None, map(lambda a: a + 1, args))[len(args) if len(args) < 3 else 2]

:-)それは地獄です。

このは0以上の引数を処理します、私が思うのは、あなたが探しているものということ。

def foo(*args):
    return map(lambda x: x + 1, args) or [None]

編集:私は0引数

を開梱のなしリストの包みを追加するために改訂
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top