Python で try/except を 1 行にする方法はありますか?
何かのようなもの...
b = 'some variable'
a = c | b #try statement goes here
Whereb
は宣言された変数であり、そうでc
はありません...したがってc
、エラーがスローされ、...a
になりb
ます
Python で try/except を 1 行にする方法はありますか?
何かのようなもの...
b = 'some variable'
a = c | b #try statement goes here
Whereb
は宣言された変数であり、そうでc
はありません...したがってc
、エラーがスローされ、...a
になりb
ます
これはひどくハックですが、デバッグ用の一連のアクションを書きたいときにプロンプトで使用しました。
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 に割り当てた方がよいでしょう。
try
Pythonでは/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:
です。)
もう 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:
です。
2線を使ってみてはどうでしょうか。大丈夫ですか ?
>>> try: a = 3; b= 0; c = a / b
... except : print('not possible'); print('zero division error')
...
not possible
zero division error
vars()
、locals()
、またはglobals()
のうち、状況に最も適したものを使用して名前空間 dict にアクセスすることで、これを行うことができます。
>>> b = 'some variable'
>>> a = vars().get('c', b)
あなたはdjangoを使用していると述べました。あなたがしていることに意味がある場合は、使用したいかもしれません:
my_instance, created = MyModel.objects.get_or_create()
created
True または False になります。多分これはあなたを助けるでしょう。