web-dev-qa-db-ja.com

pythonはお勧めしません。バイパスする方法は?

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です。このような状況を回避するにはどうすればよいですか?

14
Aufwind

Noneを返すことに何の問題もありません。

ほとんどの場合、明示的にNoneを返す必要はありません。 Pythonが自動的に行います。これはfoobarの変更バージョンであり、明示的にNoneを返さなくても同じように動作します。

def foobar(arg):
  if check:
    return result
# If not check, then None will be returned

それでも、Pythonが暗黙的にNoneを返す場合でも、明示的にすることには価値があります。コードは読みやすく、理解しやすくなります。これは常にトレードオフです。一般的な答えではありません。

42
Håvard S

それが「ノーゴー」である理由によって異なります。聞いたことがありません。単に悪い形式の場合は、「return None」(elseステートメント)を完全に省略してください。デフォルトではNoneが返されます。 Noneを返すのが悪いと考えられる場合は、呼び出し元が予期するタイプに応じて、代わりに0または ''(空の文字列)またはFalseを返します。

1
jcomeau_ictx

これに対処する方法はたくさんあります。たとえば、例外を使用したり、空白の文字列を含め、取得したものを返すだけです。これも問題ありません。

def foobar(arg):
    ...
    if check:
        return result

result = foobar(arg)
if result is not None:
    # do stuff
else:
    # do other stuff
1
Henry

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が一致しない場合に期待する戻り値であり、適切と思われる例外を処理できることを知る必要はありません。

1
forty_two