

説明のとおり、「時折数字、時折文字列のみ」のような入力に対して、下記のような処理を書いているのですが、何でも `try and except`
に投げるのはよくないと聞きました。

下記のような処理の時 `try and except` に頼らず、変数 `a`
の振り分けをするにはいかがしたらよろしいでしょうか。お知恵を拝借できましたら幸いです。

**現状のコード:**

[code]

    a = "基本的に数字が入るが、たまに数字を含まない文字列が入る"
    b = 0
    
    try :
        b = int(a)
        # 数字だったときの処理
    except :
        # 文字列だったときの処理
        pass
    
[/code]


CC BY-SA 4.0
2021-06-03T23:12:11.353
76318
2021-06-04T04:21:07.617
2021-06-04T00:23:00.593
3060
45652
question
python exception
try と except 以外の方法


質問から察するに変数aが文字列かどうかを判定したいというのが目的に感じました。  
この場合、「isinstance」で文字列か整数かどうかを調べることができます。  
例えば、こんな感じでどうでしょうか。

[code]

    if isinstance(a, str):
      # 文字列のときの処理
    elif isinstance(a, int):
      # 整数のときの処理
      b = a
    else:
      # その他の型のときの処理
      print("不正な値です。")
    
[/code]


CC BY-SA 4.0
2021-06-03T23:46:49.737
76319
2021-06-03T23:46:49.737
29034
76318
answer


`a`が文字列で、前に符号(+-)がつかない、かつ前後に空白が入らないなら、[isdecimal](https://docs.python.org/ja/3/library/stdtypes.html#str.isdecimal)あたりはどうでしょうか。

[code]

    a = "基本的に数字が入るが、たまに数字を含まない文字列が入る"
    b = 0
    
    if a.isdecimal():
        b = int(a)
        # 数字だったときの処理
    else:
        # 文字列だったときの処理
        pass
    
[/code]

[int](https://docs.python.org/ja/3/library/functions.html#int)は意外と幅広い引数を受け付けるので、上記でダメなら`try`でもいいような気はします。


CC BY-SA 4.0
2021-06-04T00:49:03.907
76322
2021-06-04T00:49:03.907
43506
76318
answer


本家(英語)StackOverflowの [Is there a built-in or more Pythonic way to try to parse
a string to an integer](https://stackoverflow.com/questions/2262333/)
に様々な回答がついていますが、質問中の用途であれば素直に例外機構の利用をおすすめします。`except`では値変換に失敗したことを表す
[`ValueError`例外](https://docs.python.org/ja/3/library/exceptions.html#ValueError)
の明示が好ましいです。

[code]

    try :
        b = int(a)
        # 数字だったときの処理
    except ValueError:
        # 文字列だったときの処理
        pass
    
[/code]

* * *

> 何でも try and except に投げるのはよくないと聞きました。

プログラム設計の一般論として、むやみに例外機構を用いるのが好ましくないことは合意します。

その一方、他プログラミング言語に比べるとPython例外機構は比較的カジュアルに使われるのも事実です。例えば反復的ループ処理を停止させるために
[`StopIteration`例外](https://docs.python.org/ja/3/library/exceptions.html#StopIteration)
が使われます。

外部記事「[Pythonで例外を投げるときのベストプラクティス](https://qiita.com/hasoya/items/05d4e49d492869875cca)」も参考にどうぞ。


CC BY-SA 4.0
2021-06-04T04:21:07.617
77328
2021-06-04T04:21:07.617
49
76318
answer