Comments 26

Использовать "О" в качестве имени переменной — это чистое зло. Помню как в бейске или паскале был ноль перечёркнут вот как от таких вот недоразумений.

Ммм? В бейсике или тем более, паскале (который может жить просто компилятором) был свой, особенный шрифт, отличный от системного?
print(_._)

О это же оператор задницы, в Scala есть почти такой же: map(_,_).

Что-то не припомню в скале такого оператора. Там конечно можно для коллекции написать что-то типа .reduce(_ + _) или .map(_._1), но ни в том, ни в другом случае это конечно никакой не оператор.

да простите, это в случае сопоставления с образцом можно забабахать, что-то вроде case MyCaseClass (_,_) => ...

Мне, наверное, повезло и я не сталкивался с таким кодом, который написан в примерах :)
В основном всё было pythonic way

Это не те wtf'ы, которые обычно ожидают вас в Питоне. Просто совсем не те. Такие вещи и без линтера видно — фигня написана.


А вот это пример wtf'а настоящего:


>>> a={ 1: 'first', True: 'second'}
>>> a[1]
'second'

Всё понятно почему, но дикий wtf.

Да, тут я сам тупанул. Чисто из-за булевой логики в python 1 и True одно и то же.
Если в коде изменить 1 на 0, а True на False результат будет тем же.
Георгий, а в чём собственно WTF? Булин — сабкласс от инта, отсюда все хэш и арифметические операции абсолютно логичны
>>> hash(1)
1
>>> hash(True)
1
>>> True + True
2

Или WTF что оно так реализовано?
In [128]: {True: 'yes', 1: 'no', 1.0: 'maybe'}                                                
Out[128]: {True: 'maybe'}

Это уже не так логично.)

По-моему ничего не изменилось в этом примере
>>> a = {True: 'yes', 1: 'no', 1.0: 'maybe'}
>>> a[True]
'maybe'
>>> a[1]
'maybe'
>>> a[1.0]
'maybe'
>>> a.__str__()
"{True: 'maybe'}"

Все три хешуются в одно и то же значение, стринг репрезентация ключа будет по первому, который попал в словарь, в данном случае класс булин.

Что такое "стринг-репрезентация"? В питоне используется object.__hash__.


Если покопаться, то можно понять что происходит.


>>> a=1
>>> b=True
>>> a.__hash__.__objclass__
<class 'int'>
>>> b.__hash__.__objclass__
<class 'int'>

Признак WTF — пока причин не знаешь, кажется ахинеей, а когда причины знаешь, они не кажутся обоснованными. Кстати, особый wtf тут доставляет то, что (1 is True) == False. Т.е. id у них разные, классы у них разные, а хеши у них почему-то одинаковые.

Я специально самый wtf случай приводил. В целом у питона умеренно строгая типизация, которую делают строже в новых версиях. О преимуществах и недостатках динамической типизации можно долго дискутировать. Недостатки — вот такие wtf'ы, преимущества — обычно в районе произвольного числа аргументов, интраспеции и 'everything is an object, even 'type' is an object'.

А вы, вольные жители Python королевства, встречались с подобной черной магией в вашем коде?
Почти все эти примеры не то, что встретить в коде, их даже выдумать сложно.
:) Зачем Владимир Филонов создаёт плохой и старый код? «У нас будут проверенные рецепты по борьбе с плохим и старым кодом от Владимира Филонова»
Only those users with full accounts are able to leave comments. Log in, please.
Information
Founded

1 February 2008

Location

Россия

Employees

11–30 employees

Registered

24 February 2010

Habr blog