9

string と int の 2 つの変数を異なるデータ型で比較したいとします。Python 2.7.3 と Python 3.2.3 の両方でテストしましたが、どちらも例外をスローしません。比較結果は ですFalse。この場合、例外をスローするさまざまなオプションを使用して Python を構成または実行できますか?

ks@ks-P35-DS3P:~$ python2
Python 2.7.3 (default, Aug  1 2012, 05:14:39) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> a="123"
>>> b=123
>>> a==b
False
>>> 
ks@ks-P35-DS3P:~$ python3
Python 3.2.3 (default, Apr 12 2012, 19:08:59) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> a="123"
>>> b=123
>>> a==b
False
>>> 
ks@ks-P35-DS3P:~$ 
4

3 に答える 3

7

いいえ、できません。アイテムが等しくないだけで、エラーはありません。

一般的に言えば、コードに特定の型のみを受け入れるよう強制するのは非 Pythonicです。intのサブクラスを作成し、どこでも動作するようにしたい場合はどうすればよいでしょうintか? Python ブール型は のサブクラスですint(たとえば、( True== 1, False== 0))。

例外が必要な場合は、次の 2 つのいずれかを行うことができます。

  1. それらの型が等しいかどうかをテストし、自分で例外を発生させます。

    if not isinstance(a, type(b)) and not isinstance(b, type(a)):
        raise TypeError('Not the same type')
    if a == b:
        # ...
    

    この例では、 a または b のいずれかを他のタイプのサブクラスにすることができます。必要に応じてそれを絞り込む必要があります (type(a) is type(b)非常に厳密にするため)。

  2. タイプを注文してみてください:

    if not a < b and not a > b:
        # ...
    

    Python 3 では、数値型をシーケンス型 (文字列など) と比較すると例外がスローされます。比較は Python 2 で成功します。

    Python 3 のデモ:

    >>> a, b = 1, '1'
    >>> not a < b and not a > b
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: unorderable types: int() < str()
    >>> a, b = 1, 1
    >>> not a < b and not a > b
    True
    
于 2013-03-16T16:14:43.697 に答える
1

日常的に使用するにはあまりにも醜くない方法でそれを達成する方法は考えられません。これは、Python プログラマーが言語の助けなしにデータ型に注意しなければならない 1 つのケースです。

データ型が string と int の間で静かに強制される言語を使用していないことに感謝してください。

于 2013-03-16T17:19:58.173 に答える
0

そのための関数を定義できます。

def isEqual(a, b):
    if not isinstance(a, type(b)): raise TypeError('a and b must be of same type')
    return a == b # only executed if an error is not raised
于 2013-03-16T16:11:28.003 に答える