int и long python. Как проводить проверку типа.

Phoenix

была такая функция
def send_money(money):
is not isinstance(money, int):
return False
return real_send_money(money)

def real_send_money(money):
buf = "give me %s bucks" % money
return send(buf)

потом оказалось, что long это не int. и общий предок у них это object.
>>> l = 1L
>>> isinstance(l,int)
False
>>> isinstance(l,long)
True
>>>

Проверять на соответствие сначала int, потом Long как-то коряво мне видится.
Появилась идея, попробовать испытание огнём, но тоже несколько коряво.
try:
money = int(money)
except ValueError:
return False

Какой путь избрать? :grin:

shlyumper

мне умные люди говорили, что проверять тип - это не pythonic. Идеоматичнее попробовать сделать с объектом то, что ты хочешь с ним сделать, и словить эксепшн на случай, если тип был не тот.

Dasar

try:
money = int(money)
except ValueError:
return False
тогда уж наоборот в long переводи, а не в int, т.к. иначе тогда большие суммы денег, которые не влазят в int - ты тоже будешь выкидывать

Phoenix

Я тоже этого принципа стараюсь придерживаться.
Но в моём примере int просто в строку кладётся. И тут не будет исключений.
Можно конечно %d вместо %s, но в 3.0 убрали это, так что стараюсь везде %s использовать.

Phoenix

int - это функция округления вроде просто или преобразования из строки. Она и long может вернуть.

>>> int(1111111111111111111111111111)
1111111111111111111111111111L
>>>

Dasar

int - это функция округления вроде просто или преобразования из строки. Она и long может вернуть.
тогда извини - не знал

Phoenix

собственно, всё сделано для того, чтобы пользователь вообще не задумывался, что у него long или int. и автоматом конвертация происходит.
Странно, что не сделали просто общего родителся для int и long.
bool вот, например, от int унаследован.

psihodog

Я тоже этого принципа стараюсь придерживаться.
Но в моём примере int просто в строку кладётся. И тут не будет исключений.
Можно конечно %d вместо %s, но в 3.0 убрали это, так что стараюсь везде %s использовать.
а в 3-м питоне разве есть лонг?

bleyman

Проверяй по numbers.Integral
И не "if ... else: return false", а ассерт напиши.
А вообще это действительно unpythonic, либо используй юниттесты как все приличные люди, либо переходи на сишарп =)
Оставить комментарий
Имя или ник:
Комментарий: