2

入力として実数(整数または浮動小数点数)を期待する関数があり、数学演算を実行する前にこの入力を検証しようとしています。

私の最初の本能は、try-exceptブロック内からfloatとして入力をキャストすることです。

try:
   myinput = float(input)
except:
   raise ValueError("input is not a well-formed number")

電話をかけることもできますisinstance(mydata, (float, int, long) )が、「これらはすべて数字である可能性があります」のリストは、私には少しエレガントではないようです。

それについて行く最もpythonicな方法は何ですか?私が見落とした別のオプションはありますか?

4

4 に答える 4

12

How much input validation should I be doing on my python functions/methods?から自分自身を引用するには :

合計、階乗などの計算では、python の組み込みの型チェックで問題ありません。計算は型に対して add や mul などを呼び出して終了し、それらが壊れた場合はとにかく正しい例外をスローします。独自のチェックを実施することにより、そうでなければ機能する入力を無効にすることができます。

したがって、最善の選択肢は、型チェックを Python に任せることです。計算が失敗すると、Python の型チェックで例外が発生するため、自分で行う場合はコードを複製するだけで、より多くの作業が必要になります。

于 2008-12-16T14:26:45.180 に答える
5

Python 2.6 および 3.0 では、数値抽象データ型の型階層が追加されたため、次のようにチェックを実行できます。

>>> import numbers
>>> isValid = isinstance(myinput , numbers.Real)

numbers.Real は整数型または浮動小数点型と一致しますが、数値以外の型や複素数とは一致しません (そのためには numbers.Complex を使用します)。有理数にも一致しますが、おそらくそれらも含めたいと思うでしょう。すなわち:

>>> [isinstance(x, numbers.Real) for x in [4, 4.5, "some string", 3+2j]]
[True, True, False, False]

残念ながら、これはすべて Python >=2.6 にあるため、2.5 以前で開発している場合は役に立ちません。

于 2008-12-16T14:58:08.003 に答える
2

assertステートメントとステートメントを組み合わせて使用​​できる場合がありますisinstance。次のようなものは、入力が要件に従っていない場合は常に例外をスローするため、よりpythonicな方法だと思います。残念ながら、あなたの数値よりも有効な数値の定義がわかりません。誰かがより良いアイデアを思いつくかもしれません。

number = (float, int, long)
assert isinstance(mydata, (float, int, long))
于 2008-12-16T14:19:43.807 に答える
1

質問がわかりません。

「代替手段」として投げかけられた、大きく異なるセマンティクスを持つ2つのものがあります。

型変換は 1 つのことです。をサポートするすべてのオブジェクトで機能し__float__ます。これは、実際には数値であるオブジェクトはほとんどありません。

try:
   myinput = float(input)
except:
   raise ValueError("input is not a well-formed number")
# at this point, input may not be numeric at all
# it may, however, have produced a numeric value

タイプテストは別のものです。これは、特定のクラス セットの適切なインスタンスであるオブジェクトでのみ機能します。

isinstance(input, (float, int, long) )
# at this point, input is one of a known list of numeric types

に応答するクラスの例を次に示しますがfloat、まだ数値ではありません。

class MyStrangeThing( object ):
    def __init__( self, aString ):
        # Some fancy parsing 
    def __float__( self ):
        # extract some numeric value from my thing

「実数 (整数または浮動小数点数のいずれか)」という質問は、一般的に無関係です。多くのものは「数値」であり、数値演算で使用できますが、int または float ではありません。たとえば、有理数パッケージをダウンロードまたは作成したとします。

一部のタイプで機能しないアルゴリズムがない限り、入力を過大評価しても意味がありません。これらはまれですが、一部の計算では整数が必要です。具体的には、整数の除算と剰余演算を実行できるようにするためです。それらについては、値が int であることを主張したい場合があります。

于 2008-12-16T19:15:47.093 に答える