2013-09-07 10 views
21

は上記でみました。このif文で1行のreturn文を書くことはできますか?

return None if x is None 

のようなものをお探しのpython

に一行のメソッドから復帰することが可能であり、そしてそれは私が簡単に行うことができます

無効な構文です:

if x is None: 
    return None 

上記のif文を1行にまとめることができるかどうか不思議です

あなたはそれを動作させるための条件で else somethingが必要

return None if x is None else something_else 

+0

リターンX ' 'で害は何? – thefourtheye

+1

@thefourtheye 'x'がNoneでなかったらどうしますか? – TerryA

+1

OPはelse部分について何も言及していませんでした。 – thefourtheye

答えて

31

標準を書き込むことができる単一のライン上の文の「if」:同じ行に

複合文(複数のステートメント:pep 8 style guideはこれをやってないことをお勧めしますしかし

if x is None: return None 

)は一般的にお勧めしません。

+1

疎は密なものよりも良い – TerryA

+7

@Haidro愚かな一貫性は少しの心のホッコブリンです;-) – nakedfanatic

32

はい、それはconditional expressionと呼ばれています。

+1

+1私にそれを打つ。 –

+0

@AshwiniChaudhary :) – TerryA

+2

しかし、xがNoneでなければ、OPがFalseを返そうとしているのかどうかは不明です。 – kojiro

1

list[bool]という表現を試すこともできます。第2ブラケットがtrueと評価された場合

return [value, None][x == None] 
は今、どれもそう返されていない、あなたが返すようにしたい値が

+3

これは、可能です。彼らが存在する前にこれをするのが理にかなったが、今は絶対に理由はない。 – Anorov

+0

+1三項式で 'return'演算子ONCEのみを使うことができることに気付いた。 'return" Yes "value == Trueの場合else" No "はelse文で" No "を返します。 –

4

免責を返されます。実際にこれをしません。 1本のライナーが本当に必要な場合は、nakedfanaticのように、PEP-8からの経験則を破るだけです。しかし、それはあなたが思ったようにreturnがなぜ行動していないのかを示し、returnかもしれないと思うように振る舞います。

return None if x is Noneと言うことができない理由は、returnが式ではなく文を導入しているからです。したがって、それをかっこする方法はありません。(return None) if x is None else (pass)などです。

これで問題は解決します。のは、それが表現ではなく、完全な声明だことを除いてreturnように振る舞う機能retを書いてみましょう:

class ReturnValue(Exception): 
    def __init__(self, value): 
     Exception.__init__(self) 
     self.value = value 

def enable_ret(func): 
    def decorated_func(*args, **kwargs): 
     try: 
      return func(*args, **kwargs) 
     except ReturnValue as exc: 
      return exc.value 
    return decorated_func 

def ret(value): 
    raise ReturnValue(value) 

@enable_ret 
def testfunc(x): 
    ret(None) if x is None else 0 
    # in a real use-case there would be more code here 
    # ... 
    return 1 

print testfunc(None) 
print testfunc(1) 
+1

これは間違いなくあなたが言うように、あなたが何をすべきかではありませんが、私はそれが少しでも賢いと思っていました。 – kqr

+0

@kqr:ファッション性の高いもの(関数デコレータ)と、抜け目のないもの(例外ではないフロー制御としての例外)を組み合わせるのが好きです;-)しかし、主なポイントは 'return'が式ではないことを示すことです式を使って関数から出る方法は何かを投げることです。または 'yield'-expressionですが、これは一般的には適用できません。 –

関連する問題