Можно ли передавать типы как аргументы функций, как в приведенном ниже примере?
def test(*args):
'''decorator implementation with asserts'''
...
@test(str, int)
def fn1(ma_chaine, mon_entier):
return ma_chaine * mon_entier
@test(int, int)
def fn2(nb1, nb2):
return nb1 * nb2
или я должен передать их как строки (например, @test('str', 'int)
), а внутри тестовой функции использовать их с if
и elif
?
Это работает?
def test(obj, typ):
if isinstance(obj, typ):
print('Type Matches')
return True
return False
test('mystring', str)
"Type Matches"
да.
Должны ли вы это сделать?
И еще немного информации о проверке типов
Делая это, вы фактически пытаетесь превратить Python в язык со статической типизацией, что не очень похоже на питон. Если вы используете Python 3.6 или выше, я бы порекомендовал взглянуть на тип подсказки, который обеспечивает некоторый уровень статической проверки типов. Официальный PEP
Аргумент функции Python не заботится о своем типе.
Вы можете передавать аргументы любого типа и можете проверять тип аргументов.
Это просто, вы можете проверить тип аргументов, которые вы получаете.
пытаться
def fn1(ma_chaine, mon_entier):
if type(ma_chaine) == int && type(mon_entier) == int:
return ma_chaine * mon_entier
else:
raise TypeError("Arguments should be 'int' type. Got '{}' type and '{}' type.".format(type(ma_chaine), type(mon_entier))
В качестве примечания следует уточнить, что type() ==
будет вести себя иначе, чем isinstance()
. Ознакомьтесь с ответами здесь. Они также по-разному обрабатывают логические значения.
Спасибо за комментарий! Я знал только о том, что «if ~ is~:» отличается от «if ~ == ~», но я не знал о функции isinstance(). Я узнаю еще один из вашего комментария. Еще раз спасибо @PyPingu!
Спасибо за ваш ответ. Я также понимаю по вашей ссылке, что явное предварительное условие намного лучше, чем это. код