Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 16, 2007 18:24:18

multik
От:
Зарегистрирован: 2007-10-16
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

python type-cast

сразу приведу упрощенный пример, чтобы понятна была суть вопроса

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()
не предлагать ;)



Офлайн

#2 Окт. 16, 2007 18:55:18

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

python type-cast

Првду люди говорят: хорошо заданный вопрос содержит в себе большую часть ответа. лишний раз в этом убедился:)



Офлайн

#3 Окт. 16, 2007 20:09:51

j2a
От:
Зарегистрирован: 2006-06-29
Сообщения: 869
Репутация: +  1  -
Профиль   Отправить e-mail  

python type-cast

можно, переопределив для класса A операцию сложения (см. магические методы __add__, __radd__, __ladd__), но я бы не стал.



Отредактировано (Окт. 16, 2007 20:10:44)

Офлайн

#4 Окт. 16, 2007 20:12:48

j2a
От:
Зарегистрирован: 2006-06-29
Сообщения: 869
Репутация: +  1  -
Профиль   Отправить e-mail  

python type-cast

Daevaorn
Првду люди говорят: хорошо заданный вопрос содержит в себе большую часть ответа. лишний раз в этом убедился:)
(с) Роберт Шекли, Верный вопрос. :)



Офлайн

#5 Окт. 17, 2007 13:08:04

multik
От:
Зарегистрирован: 2007-10-16
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

python type-cast

ok. как вообще преведение типов в пайтоне работает? тоесть допустим

x = 5 + 3.4
type(x)
видно, что x приведен к float. несмотря на то, что 5 – это int. тоесть некоторое приведение типов все же имеется.
почему интерпретатор не пытается привести второй аргумент к str при конкатенации? т.е. в случае использования оператора + с правой либо левой частью – строкой.



Офлайн

#6 Окт. 17, 2007 14:12:16

poltergeist
От:
Зарегистрирован: 2007-02-28
Сообщения: 522
Репутация: +  0  -
Профиль   Отправить e-mail  

python type-cast


>>> 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
почему интерпретатор не пытается привести второй аргумент к str при конкатенации?
А должен? 5 + 3.4 - это сложение, а не конкатенация!

j2a в 3-м посте вроде всё сказал, и советую думать логично, а не так как захочется.



Отредактировано (Окт. 17, 2007 14:13:20)

Офлайн

#7 Окт. 17, 2007 14:58:54

redixin
От:
Зарегистрирован: 2006-11-27
Сообщения: 66
Репутация: +  1  -
Профиль   Отправить e-mail  

python type-cast

приводить int к float'у это еще куда ни шло, но строку к инту или наоборот в питоне не катит, этож вам не пхп какойнибудь, всетаки строгая типизация
зато не будешь голову ломать что к чему он приведет в случае с ‘5’ + 5. это спасает нас от всяких стремных глюков вроде

a = ‘1’
a + 1

a = ‘a’
a + 1

в первом случае будет сложение, во втором конкатенация? нееее, не надо нам такого



Офлайн

#8 Окт. 17, 2007 22:06:53

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

python type-cast

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. Способ довольно неоднозначный, я бы его не применял направо и налево. Но - работает.



Офлайн

#9 Окт. 19, 2007 10:03:51

multik
От:
Зарегистрирован: 2007-10-16
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

python type-cast

poltergeist
А должен? 5 + 3.4 - это сложение, а не конкатенация!
довод проигнорирован. в случае со строкой оператор + именно конкатенация. советовать вам ничего не буду ;)

redixin
приводить int к float'у это еще куда ни шло, но строку к инту или наоборот в питоне не катит, этож вам не пхп какойнибудь, всетаки строгая типизация
зато не будешь голову ломать что к чему он приведет в случае с ‘5’ + 5. это спасает нас от всяких стремных глюков вроде

a = ‘1’
a + 1

a = ‘a’
a + 1

в первом случае будет сложение, во втором конкатенация? нееее, не надо нам такого
такие неоднозначности решаются только в пределах спецификаций не более.
к сожалению, не в курсе как это работает в php, но возьмем, к примеру, java. там принято соглашение: оператор + если один из аргументов String у второго аргумента вызовет toString(). результат String. никакой неоднозначности нет. язык тоже строго типизированный.
соответственно для вашего примера и в первом и во-втором случаях результат строка ('11' и ‘a1’ соответственно).

Андрей Светлов
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. Способ довольно неоднозначный, я бы его не применял направо и налево. Но - работает.
спасибо! а применять приходится не потому что мне так захотелось, а потому что есть набор требований на модуль и есть код библиотеки, который я не могу менять по лицензионным ограничениям.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version