Если вы действительно, действительно хотят быть 100% уверены, что сравнение строк и Интс невозможно, вы можете перегрузить __builtin__.int
(и __builtin__.float
и т. д. по необходимости), чтобы запретить сравнение целых чисел (и плавающих и т. д.) со строками. Это будет выглядеть следующим образом:
import __builtin__
class no_str_cmp_int(int):
def __lt__(self,other):
if type(other) is str:
raise TypeError
return super.__lt__(other)
def __gt__(self,other):
if type(other) is str:
raise TypeError
return super.__gt__(other)
# implement __gte__, __lte__ and others as necessary
# replace the builtin int method to disallow string comparisons
__builtin__.int = no_str_cmp_int
x = int(10)
Затем, если вы попытаетесь сделать что-то вроде этого, вы получите эту ошибку:
>>> print x < '15'
Traceback (most recent call last):
File "<pyshell#15>", line 1, in <module>
print x < '15'
File "tmp.py", line 7, in __lt__
raise TypeError
TypeError
Существует большой нюанс такого подхода, однако. Он заменяет только функцию int
, поэтому каждый раз, когда вы создавали int, вам нужно передать ее через функцию, как это было в объявлении x
выше. Литералы будут по-прежнему быть оригинальным типом int
, и насколько я знаю, нет способа изменить это. Однако, если вы правильно создадите эти объекты, они будут продолжать работать со 100% гарантией, которую вы желаете.
Нет, нет, поэтому они поменяли его на Python 3.x. При написании в Python 2.7 просто будьте осторожны :) – CoryKramer
Спасибо всем за ваши ответы. –