Форум сайта python.su
сразу приведу упрощенный пример, чтобы понятна была суть вопроса
class A:
def __str__(self):
return 'abc'
print '123' + A()
# это порождает исключение
# TypeError: cannot concatenate 'str' and 'instance' objects
print '123' + str(A())
# это работает нормально
'123%s' % A()
Офлайн
Првду люди говорят: хорошо заданный вопрос содержит в себе большую часть ответа. лишний раз в этом убедился:)
Офлайн
можно, переопределив для класса A операцию сложения (см. магические методы __add__, __radd__, __ladd__), но я бы не стал.
Отредактировано (Окт. 16, 2007 20:10:44)
Офлайн
Daevaorn(с) Роберт Шекли, Верный вопрос. :)
Првду люди говорят: хорошо заданный вопрос содержит в себе большую часть ответа. лишний раз в этом убедился:)
Офлайн
ok. как вообще преведение типов в пайтоне работает? тоесть допустим
x = 5 + 3.4
type(x)
Офлайн
>>> 5 + ‘3.5’
Traceback (most recent call last):
File “<pyshell#0>”, line 1, in <module>
5 + ‘3.5’
TypeError: unsupported operand type(s) for +: ‘int’ and ‘str’
>>>
multikА должен? 5 + 3.4 - это сложение, а не конкатенация!
почему интерпретатор не пытается привести второй аргумент к str при конкатенации?
Отредактировано (Окт. 17, 2007 14:13:20)
Офлайн
приводить 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'
# тоже работает
Офлайн
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. Способ довольно неоднозначный, я бы его не применял направо и налево. Но - работает.
Офлайн