2015-04-13 2 views
-1

В методах Python немного странно, по крайней мере, по сравнению с другими языками. Функция, скажем, в C++, выходит что-то вроде этого:Методы, типы и Python

void foo(int i){ 
    cout << i*2 << "\n"; 
} 

Это гарантирует, что объект передается в эту функцию, на самом деле является целым числом. Однако в Python та же функция выглядит следующим образом:

def foo(i): 
    print i*2 

Эта функция не требует i быть целым числом, не говоря уже номер. Вы могли бы даже пройти в строку. Поэтому мой вопрос: каков общий подход к обработке этого при написании кода? Вообще говоря, лучше ли проверять тип и выкидывать сообщение об ошибке, если оно используется некорректно, или предпочитает вообще не проверять и считать, что правильный тип был передан?

+2

Вы прочитали, например. https://docs.python.org/3/glossary.html#term-duck-typing? На SO также есть много связанных вопросов: http://stackoverflow.com/q/11328920/3001761 - это начало. – jonrsharpe

+0

Кроме того, проверка типа и выдача ошибки совершенно бессмысленна, поскольку в любом случае она будет вызывать ошибку, если тип несовместим. – wvdz

+0

Похоже, вы никогда не слышали о динамически типизированном языке. Python вряд ли является единственным: Javascript и Ruby - это два других, с которыми вы можете столкнуться, но их гораздо больше. –

ответ

0

С Python, вы хотите, чтобы справиться с этой ситуацией, проверив вход с:

try: 
    val = int(userInput) 
except ValueError: 
    print("That's not an int!") 

Это пытается преобразовать пользовательский ввод целого, и если он не в состоянии быть преобразованы, он бросает ValueError ,

+0

Что случилось с этим ответом? – TigerhawkT3

+0

вы можете проверить ошибку, как это в python, потому что в C++ и других статических языках она все равно будет выдавать исключение, если значение, переданное в функцию, не является целым числом – danidee

+0

Кажется, вы отвечаете на вопрос «как я могу сказать если строка может быть успешно преобразована в целое число? " когда ОП спрашивает: «Как мне определить, является ли переменная типом, который, на мой взгляд, является?». «int (x) не сбой» не означает, что «x является int». – Kevin

1

Это субъективно. Самый простой способ убедиться, что ваши аргументы имеют правильный тип, - это оператор assert - в вашем примере что-то вроде assert isinstance(i, int), "foo expects an int!" Но это не является абсолютно необходимым - если он не будет работать с ошибочными аргументами, он будет все равно выкидывайте ошибку.

Короче говоря, сделайте то, что поможет вам отлаживать лучшее.

+1

просто добавьте, если вы предпочитаете больше скорости, чем 'assert' или' isinstance', используйте 'type (object)' для чтения или 'object .__ class__' для производительности. – Tcll

Смежные вопросы