7

数値型で動作することを期待する関数があります。ファイルから操作する数値を読み取っているので、数値ではなく文字列で読み取っています。関数を他の型に対して許容できるようにするか (以下のオプション (A))、関数を呼び出す前に数値に変換するか (以下のオプション (B))?

# Option (A)
def numeric_operation(arg):
    i = int(arg)
    # do something numeric with i

# Option (B)
def numeric_operation(arg):
    # expect caller to call numeric_operation(int(arg))
    # do something numeric with arg
4

4 に答える 4

6

関数が数値データを操作することを想定している場合、Python が数値データをTypeError 受け取らず、何か問題が発生した場合に、Python が をスローできるようにするのがおそらく最善です。私は、外部で変換を行い、例外を処理すると言います。

def numeric_operation(arg):
   # Do numeric things

try: 
  numeric_operation("abc")
except TypeError:
  print("That was supposed to be numeric.")
于 2012-04-22T12:37:42.533 に答える
5

これらの操作を分割します。ファイルから数値を読み取る関数を 1 つ用意し、その関数が実数または配列を返すようにします。数値演算を行う関数は、呼び出すたびに変換を処理する必要はなく、関数ごとに実装する必要もありません。数値、数値のリスト、および配列を同様に受け入れる数値関数など、例外がある場合があります。

すべてを組み合わせると、文字列は表示されません。なぜあなたはすべきですか?あなたが言及したファイルには実際の文字列はありません。これらは文字列としてエンコードされた数値であるため、それに応じて読み取り、ファイルからデータをインポートする関数で変換を非表示にします。

于 2012-04-22T12:40:23.543 に答える
1

何もしないでください。

Python にはすでに優れたエラー処理メカニズムがあり、文字列で数値を処理しようとするとスローされ、何を行っても、発生すると予想されるエラーが隠蔽されます。

>>> def foo(i):
...     return i+1
...
>>> foo(3)
4
>>> foo("hello")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in foo
TypeError: Can't convert 'int' object to str implicitly
于 2012-04-22T13:03:10.760 に答える
1

それはあなたのユースケースに大きく依存します。関数名は、これが厳密に数学的な操作であることを示唆しています。その場合、文字列を受け入れることはおそらく意味がありません。これは基本的に、関心の分離に関する問題です。関数が数学を行う場合、変換も行うべきではありません。したがって、この場合、最初に変換し、数値型のみを関数に渡すことをお勧めします。

しかし、たとえば、これが多くの I/O をint実行する関数である場合、渡されたものは何でも呼び出すことが完全に合理的である可能性があります。エンドユーザーに表示できるようにするか、ユーザー入力を変換するには、これらの変換をカプセル化して、可能な限りグループ化して、変換が行う作業が他の機能に「流れ込む」ことがないようにする必要があります。

于 2012-04-22T12:37:51.473 に答える