class A:
def __str__(self):
return 'abc'
print '123' + A()
# это порождает исключение
# TypeError: cannot concatenate 'str' and 'instance' objects
print '123' + str(A())
# это работает нормально
ps: конструкцию вида
'123%s' % A()
class A:
def __str__(self):
return 'abc'
print '123' + A()
# это порождает исключение
# TypeError: cannot concatenate 'str' and 'instance' objects
print '123' + str(A())
# это работает нормально
'123%s' % A()
Daevaorn(с) Роберт Шекли, Верный вопрос. :)
Првду люди говорят: хорошо заданный вопрос содержит в себе большую часть ответа. лишний раз в этом убедился:)
x = 5 + 3.4
type(x)
multikА должен? 5 + 3.4 - это сложение, а не конкатенация!
почему интерпретатор не пытается привести второй аргумент к str при конкатенации?
class A:
def __str__(self):
return 'abc'
def __coerce__(self, other):
if isinstance(other, str):
return (str(self), other)
else:
return None
print '123' + str(A())
# это работает нормально
print '123' + A(), A()+'123'
# тоже работает
poltergeistдовод проигнорирован. в случае со строкой оператор + именно конкатенация. советовать вам ничего не буду ;)
А должен? 5 + 3.4 - это сложение, а не конкатенация!
redixinтакие неоднозначности решаются только в пределах спецификаций не более.
приводить int к float'у это еще куда ни шло, но строку к инту или наоборот в питоне не катит, этож вам не пхп какойнибудь, всетаки строгая типизация
зато не будешь голову ломать что к чему он приведет в случае с ‘5’ + 5. это спасает нас от всяких стремных глюков вроде
a = ‘1’
a + 1
a = ‘a’
a + 1
в первом случае будет сложение, во втором конкатенация? нееее, не надо нам такого
Андрей Светлов
class A:
def __str__(self):
return ‘abc’
def __coerce__(self, other):
if isinstance(other, str):
return (str(self), other)
else:
return None
print ‘123’ + str(A())
# это работает нормально
print ‘123’ + A(), A()+'123'
# тоже работает
Андрей Светловспасибо! а применять приходится не потому что мне так захотелось, а потому что есть набор требований на модуль и есть код библиотеки, который я не могу менять по лицензионным ограничениям.
Для чисел подобная процедура делается через coercing. Способ довольно неоднозначный, я бы его не применял направо и налево. Но - работает.