
Viktor
03.06.2016
20:02:49

Zart
03.06.2016
20:02:51
один объект другому по дефолту не равен

Марк
03.06.2016
20:03:12
id у них одинаковы

Viktor
03.06.2016
20:03:14

Google

Viktor
03.06.2016
20:03:21

Zart
03.06.2016
20:03:29
не одинаковы
потому что он мгновенно освобождал объект
если он сделает
a = object()
b = object()
то рефкаунты на созданные объекты не будут падать в ноль, объекты будут разными и их id() тоже

Марк
03.06.2016
20:05:04
In [48]: id(object())== id(object())
Out[48]: True
In [49]: object()== object()
Out[49]: False

Zart
03.06.2016
20:05:16
причем надо учитывать что дефолтный репл еще хранит последнее значение в _ обычно, и это порой заставляет объект еще жить до следующей команды

Марк
03.06.2016
20:05:25
Это как пояснить?

Viktor
03.06.2016
20:05:37
И для второго

Zart
03.06.2016
20:06:17

Марк
03.06.2016
20:06:22
In [50]: id(object()) is id(object())
Out[50]: False
In [51]: object() is object()
Out[51]: False
Хотя есть еще вот так

Viktor
03.06.2016
20:06:38

Google

Zart
03.06.2016
20:06:48
object создается, результат суется в id, после этого сразу же освобождается
потом создается заново, суется во второй айди

Viktor
03.06.2016
20:06:57

Zart
03.06.2016
20:07:03
ты умудряешься пересоздать объект в одной области памяти на лету

Марк
03.06.2016
20:07:38
In [52]: id(object())
Out[52]: 3072869880L
In [53]: id(object())
Out[53]: 3072869880L

Zart
03.06.2016
20:08:06
цпитон по дефолту грохает объекты сразу как рефкаунт падает в ноль
а вот айронпитон - нет. там грохание идёт на этапе вызова гц

Viktor
03.06.2016
20:08:09

Zart
03.06.2016
20:08:54
поэтому код вида data = open('filename').read() в цпитоне закроет файл сразу
а в айронпитоне ссылка доживет до выхода из программы и вызовет мат в виде варнинга про ресурсы

drjackild
03.06.2016
20:11:47
Кстати, к теме вопросов на собеседовании. Сегодня был в СофтСерв, задали такой вопрос:
К примеру у нас есть класс, который может быть использован в качестве контекс-менеджера:
class Manager:
def __enter__(self):
CODE BLOCK 1
return self
def __exit__(self, exception_code, exception_value, traceback):
CODE_BLOCK 2
return False
есть такой пример кода:
with Manager():
CODE_BLOCK 3
Предположим, в Питоне 3.6 отказались от контекст менеджеров. Как должен выглядеть код, который выполняет все эти куски кода в такой же последовательности и с такими же условиями, как и в контекст менеджере (предполагается, что у нас нет класа Манагер, а просто есть три куска кода.

Sergey
03.06.2016
20:14:32
1; try: 3 finally: 2 ?
/me не знает питон

drjackild
03.06.2016
20:15:01
не
в принципе мыслишь в том направлении, но не совсем

Zart
03.06.2016
20:15:34
Кстати, к теме вопросов на собеседовании. Сегодня был в СофтСерв, задали такой вопрос:
К примеру у нас есть класс, который может быть использован в качестве контекс-менеджера:
class Manager:
def __enter__(self):
CODE BLOCK 1
return self
def __exit__(self, exception_code, exception_value, traceback):
CODE_BLOCK 2
return False
есть такой пример кода:
with Manager():
CODE_BLOCK 3
Предположим, в Питоне 3.6 отказались от контекст менеджеров. Как должен выглядеть код, который выполняет все эти куски кода в такой же последовательности и с такими же условиями, как и в контекст менеджере (предполагается, что у нас нет класа Манагер, а просто есть три куска кода.
это тест на знание https://www.python.org/dev/peps/pep-0343/

Andrei
03.06.2016
20:16:03
А я даж задачу не понял.
Слава Аллаху, я на крестах пишу D:

Zart
03.06.2016
20:16:31
там надо правильно аргументы в __exit__ передать
в finally и except случаях
не помню точно, но чтото типа
m = Manager()
try:
m.__enter__()
except:
m.__exit__(*sys.exc_info())
finally:
m.___exit__(None, None, None)
на самом деле сложнее, и с кэшированием ентер/эксит методов. в пепе расписан алгоритм детально
вся фигня с with заныкана в обработке исключений

Google

drjackild
03.06.2016
20:19:11
не не, класса нет, считай, что ты просто копи-пастишь три куска кода (block 1, block 2 block 3). как они должны быть записаны?

Zart
03.06.2016
20:19:19
а

drjackild
03.06.2016
20:19:26
короче ладно, я походу не совсем ясно выразился может быть

Sergey
03.06.2016
20:19:37
так аргументы в CODE_BLOCK 2 используются?

drjackild
03.06.2016
20:19:42
в общем, вот так они мне по итогу показали (я оказался неправ)
BLOCK 1
try:
BLOCK 3
except:
BLOCK 2

Zart
03.06.2016
20:20:18
чтото типа
code block 1
try
block 3
finally
block 2
ага, так и думал

Andrei
03.06.2016
20:20:28
-___-

drjackild
03.06.2016
20:20:40
смысл в том, что в случае эксепшена, __exit__ не выполняется

Andrei
03.06.2016
20:20:42
Ебанутое задание. И спаведливо что не взяли

Viktor
03.06.2016
20:20:43

Zart
03.06.2016
20:20:45
да

drjackild
03.06.2016
20:20:51
ну, в оригинале сложнее немного

Sergey
03.06.2016
20:20:58
это как?

drjackild
03.06.2016
20:20:58
но смысл понятен, я думаю
@AndreiC кого не взяли и куда?

Viktor
03.06.2016
20:21:24
Там выполняется вообще-то exit если НЕТ exception'а

Zart
03.06.2016
20:21:30
и волен выполнить или не выполнить свой блок

Google

drjackild
03.06.2016
20:21:46
ну да, это я и имел ввиду под "сложнее")

Andrei
03.06.2016
20:22:12

Viktor
03.06.2016
20:22:15
Ну так они вообще не то дали
Ответ тупой какой-то
Они так with open сломают

drjackild
03.06.2016
20:22:36
Андрей, ну да, неправильно, но результата еще не было, если че))

Viktor
03.06.2016
20:22:41
Не будет файлы закрывать

drjackild
03.06.2016
20:23:07
Виктор, ну я так понимаю, это упрощенный вариант понимания вообще, как работают контекст-менеджеры

Viktor
03.06.2016
20:23:29
Так там именно finally, а не except!

drjackild
03.06.2016
20:23:41
не совсем, опять же
ща

Viktor
03.06.2016
20:23:56
Да я только из спецификации

Andrei
03.06.2016
20:24:03

Zart
03.06.2016
20:24:13
в спеке подробно расписано. и про файналли и про ексепт

Viktor
03.06.2016
20:24:46
Короче, finally ближе к правде чем except

Andrei
03.06.2016
20:24:48

drjackild
03.06.2016
20:25:54
Ну, я явно не синиор, и даже не миддл, как по мне, так что меня не будут так строго судить. Но вообще, я думаю, что не прошел.

Sergey
03.06.2016
20:26:48
меньше надо думать

drjackild
03.06.2016
20:27:14
в чате программистов как-то странно звучит фраза)

Google

Viktor
03.06.2016
20:27:46
with EXPR as VAR:
BLOCK
-------/---------
mgr = (EXPR)
exit = type(mgr).__exit__ # Not calling it yet
value = type(mgr).__enter__(mgr)
exc = True
try:
try:
VAR = value # Only if "as VAR" is present
BLOCK
except:
# The exceptional case is handled here
exc = False
if not exit(mgr, *sys.exc_info()):
raise
# The exception is swallowed if exit() returns true
finally:
# The normal and non-local-goto cases are handled here
if exc:
exit(mgr, None, None, None)
Вот оно

Sergey
03.06.2016
20:28:24
а программистам вообще думать надо запретить

Zart
03.06.2016
20:28:27
if not заметь

drjackild
03.06.2016
20:28:29
ну так часть про if not ext видишь

Zart
03.06.2016
20:28:34
и то что в оригинале там был return False
т.е. это значит что их Манагер() пропускает исключения дальше

drjackild
03.06.2016
20:29:00
короче, лажанул я с этим вопросом

Sergey
03.06.2016
20:29:18
а, значит надо except: pass добавить

drjackild
03.06.2016
20:29:18
ща еще вспомню. вообще, довольно интересно было, толковые мужики попались.

Zart
03.06.2016
20:29:21
поэтому в его случае это простой трай-файналли

drjackild
03.06.2016
20:29:32
а

Viktor
03.06.2016
20:29:42

Zart
03.06.2016
20:29:45

drjackild
03.06.2016
20:29:48
"Чем отличаются транзакции в MongoDB от MySQL"

Sergey
03.06.2016
20:29:49
тьфу, наоборот
if not

Zart
03.06.2016
20:30:01
там if not: raise который ререйзит исключение дальше

Sergey
03.06.2016
20:30:04
значит я был прав

Viktor
03.06.2016
20:30:15

Zart
03.06.2016
20:30:27

drjackild
03.06.2016
20:30:32
Python backend dev