120

Python で try/except を 1 行にする方法はありますか?

何かのようなもの...

b = 'some variable'
a = c | b #try statement goes here

Wherebは宣言された変数であり、そうでcはありません...したがってc、エラーがスローされ、...aになりbます

4

15 に答える 15

89

これはひどくハックですが、デバッグ用の一連のアクションを書きたいときにプロンプ​​トで使用しました。

exec "try: some_problematic_thing()\nexcept: problem=sys.exc_info()"
print "The problem is %s" % problem[1]

ほとんどの場合、no-single-line-try-except 制限にまったく悩まされていませんが、実験しているだけで、対話型インタープリターで readline にコード全体を一度に呼び出してもらいたい場合は、どうにかして調整できるようにするには、この小さなトリックが役立ちます。

達成しようとしている実際の目的のために、試してみてくださいlocals().get('c', b)。理想的には、ローカル コンテキストの代わりに実際の辞書を使用するか、c を設定してもしなくても実行する前に単に c を None に割り当てた方がよいでしょう。

于 2011-11-09T06:26:30.380 に答える
72

tryPythonでは/exceptブロックを1行に圧縮する方法はありません。

また、他の動的言語のように、Pythonに変数が存在するかどうかを知らないのは悪いことです。より安全な方法(および一般的なスタイル)は、すべての変数を何かに設定することです。設定されない可能性がある場合は、最初に設定しますNone(または0''より適切な場合は、または何か)。


最初に関心のあるすべての名前を割り当てる場合は、オプションがあります。

  • 最良のオプションはifステートメントです。

    c = None
    b = [1, 2]
    
    if c is None:
        a = b
    else:
        a = c
    
  • ワンライナーオプションは条件式です。

    c = None
    b = [1, 2]
    a = c if c is not None else b
    
  • 一部の人々はこれを行うためにの短絡動作を悪用しorます。これはエラーが発生しやすいので、私は決して使用しません。

    c = None
    b = [1, 2]
    a = c or b
    

    次の場合を考えてみましょう。

    c = []
    b = [1, 2]
    a = c or b
    

    この場合、aおそらくはであるはずですが、ブール値のコンテキストではfalseである[]ため[1, 2]です。[]間違っている可能性のある値がたくさんあるので、私はそのorトリックを使用しません。if foo:(これは、人々が意味するときに言うときに遭遇するのと同じ問題if foo is not None:です。)

于 2010-03-26T16:26:17.867 に答える
17

もう 1 つの方法は、コンテキスト マネージャーを定義することです。

class trialContextManager:
    def __enter__(self): pass
    def __exit__(self, *args): return True
trial = trialContextManager()

次に、withステートメントを使用して、1 行でエラーを無視します。

>>> with trial: a = 5      # will be executed normally
>>> with trial: a = 1 / 0  # will be not executed and no exception is raised
>>> print a
5

実行時エラーの場合、例外は発生しません。try:のないのようなものexcept:です。

于 2017-08-23T13:25:45.487 に答える
7

2線を使ってみてはどうでしょうか。大丈夫ですか ?

>>> try: a = 3; b= 0; c = a / b
... except : print('not possible'); print('zero division error')
...
not possible
zero division error
于 2020-04-08T03:21:06.707 に答える
4

vars()locals()、またはglobals()のうち、状況に最も適したものを使用して名前空間 dict にアクセスすることで、これを行うことができます。

>>> b = 'some variable'
>>> a = vars().get('c', b)
于 2010-03-26T18:02:07.593 に答える
2

あなたはdjangoを使用していると述べました。あなたがしていることに意味がある場合は、使用したいかもしれません:

my_instance, created = MyModel.objects.get_or_create()

createdTrue または False になります。多分これはあなたを助けるでしょう。

于 2010-03-26T16:44:45.580 に答える