httplib
を使用してlxml
でURLに接続する関数があります。 xpath
によって特定のパターンをチェックし、チェックが正の場合は文字列を返します。ただし、チェックが負の場合は何も返されません。
今の状況は、私の関数がNone
を返すということです。関数を呼び出し、戻り値がnot None
であるかどうかを確認して、コードを続行します。
例:
def foobar(arg):
# connect to page by httplib
# check for arg in a certain pattern by lxml
if check:
return result
else:
return None
result = foobar(arg)
if result:
# do stuff
else:
# do other stuff
最近読んだのですが、これはno goです。このような状況を回避するにはどうすればよいですか?
None
を返すことに何の問題もありません。
ほとんどの場合、明示的にNone
を返す必要はありません。 Pythonが自動的に行います。これはfoobar
の変更バージョンであり、明示的にNone
を返さなくても同じように動作します。
def foobar(arg):
if check:
return result
# If not check, then None will be returned
それでも、Pythonが暗黙的にNone
を返す場合でも、明示的にすることには価値があります。コードは読みやすく、理解しやすくなります。これは常にトレードオフです。一般的な答えではありません。
それが「ノーゴー」である理由によって異なります。聞いたことがありません。単に悪い形式の場合は、「return None」(elseステートメント)を完全に省略してください。デフォルトではNoneが返されます。 Noneを返すのが悪いと考えられる場合は、呼び出し元が予期するタイプに応じて、代わりに0または ''(空の文字列)またはFalseを返します。
これに対処する方法はたくさんあります。たとえば、例外を使用したり、空白の文字列を含め、取得したものを返すだけです。これも問題ありません。
def foobar(arg):
...
if check:
return result
result = foobar(arg)
if result is not None:
# do stuff
else:
# do other stuff
None
を返すことは、スタイルではなく、使いやすさの観点から「no go」だと思います。 this 回答で簡単に述べたように、代わりに例外を発生させることを検討してください。例えば:
def foobar(arg):
# connect to page by httplib
# check for arg in a certain pattern by lxml
if not check:
raise ValueError("arg did not match pattern in lxml")
return result
try:
result = foobar(arg)
except ValueError:
result = None
if result is not None:
# do stuff
else:
# do other stuff
このアプローチの利点は、一致するものがない場合に明示的になることです。関数を使用している他の人は、None
が一致しない場合に期待する戻り値であり、適切と思われる例外を処理できることを知る必要はありません。