
Eugene
02.03.2017
14:43:14

Александр
02.03.2017
14:43:32
спасибо

Mikhail
02.03.2017
14:43:57

Google

Serge
02.03.2017
14:46:34

Gregory
02.03.2017
14:47:11

Serge
02.03.2017
14:47:53

Sergey
02.03.2017
14:48:11

GNU/Docker
02.03.2017
14:48:17
хехе

Gregory
02.03.2017
14:48:23
¯\_(ツ)_/¯

Serge
02.03.2017
14:48:30

GNU/Docker
02.03.2017
14:48:47
Ох не всегда)

Александр
02.03.2017
14:48:56
а можно использовать другое имя, не self?
Можно, но как я понимаю, просто договорились, что для classmethod cls, для остального self
для статик метода первый аргумент не имеет смысла, т.к. метод использется без инстанса

Sergey
02.03.2017
14:48:57
не всегда;)
статический метод это функция прикрепленная к классу для удобства

Serge
02.03.2017
14:49:24

Sergey
02.03.2017
14:49:42
так его не надо на инстансе вызывать)

Google

Serge
02.03.2017
14:50:09

Sergey
02.03.2017
14:50:26
ClassName.static_method_name()

Александр
02.03.2017
14:50:39
)))

Serge
02.03.2017
14:50:40
и тоже не будет работать

Gregory
02.03.2017
14:50:45
Ха, а есть жеж python-koans, там эти вещи можно руками потрогать и посмотреть как оно работает (вроде как)

Serge
02.03.2017
14:50:56

Gregory
02.03.2017
14:51:08

Serge
02.03.2017
14:51:09

Roman
02.03.2017
14:51:36

Sergey
02.03.2017
14:52:11

Vadim
02.03.2017
14:52:46

Eugene
02.03.2017
14:52:59

Serge
02.03.2017
14:53:44

Sergey
02.03.2017
14:53:50
https://www.youtube.com/watch?v=HTLu2DFOdTg
вот это видео давным давно смотрел, там про staticmethod объясняется

Eugene
02.03.2017
14:54:25
поэтому функцию можно вызвать только так:
f(10, 20, c=4)
ну или так:
f(10, b=20, c=4)
но так уже не выйдет:
f(10, 20, 4)

Sergey
02.03.2017
14:54:37

GNU/Docker
02.03.2017
14:54:52
лол

Gregory
02.03.2017
14:55:59
@filinvadim
Еще советую exercism.io там решаешь небольшие задачки, а потом тебе подсказывают как их можно более идиоматично сделать

Eugene
02.03.2017
14:57:40
Вообще в питоне настолько богатые возможности по сигнатуре функций, что если надо что-то инспектить, связанное с ними - это всегда возня.
Ну, например, "Написать функцию, которой можно передавать аргументы либо списком/кортежем, либо по одному. Функция производит суммирование всех аргументов."

Sergey
02.03.2017
14:57:50
ну извините, в django не использовал staticmethod, а classmethod использовал и сейчас всё перемешалось

Google

GNU/Docker
02.03.2017
14:59:13

Sergey
02.03.2017
14:59:35

Gregory
02.03.2017
15:01:59
Всегда пожалуйста, сам рад что узнал в своё время про проект.

Eugene
02.03.2017
15:03:21
По поводу frozenset. Например, мне нужен свой класс, в который я задаю какой-то ещё параметр. Логично, что переопределяем конструктор и типа работает. А вот и нет.
class myset(frozenset):
def __init__(self, myarg, *args, **kwargs):
self._myarg = myarg
super().__init__(*args, **kwargs)
myset('hello', [1,2,3])
TypeError: myset expected at most 1 arguments, got 2
:)

Nikolay
02.03.2017
15:05:29
https://meduza.io/feature/2017/03/02/razrabotchik-obmanul-kapchu-google-s-pomoschyu-drugogo-servisa-google

Eugene
02.03.2017
15:06:31
Ок, пробуем без аргумента:
class myset(frozenset):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
myset([1,2,3])
TypeError: object.__init__() takes no parameters
Почему? :)

Sergey
02.03.2017
15:11:28

Nikolay
02.03.2017
15:12:18

Vadim
02.03.2017
15:14:35

Eugene
02.03.2017
15:20:46
Так почему простое наследование с переопределением __init__ от frozenset не работает, а от list работает?
class mylist(list):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
mylist([1,2,3,4])
[1, 2, 3, 4]
И кстати, от tuple тоже не работает. :)
И тут мы начинаем смутно догадываться о чём то с immutable типами

Nikolay
02.03.2017
15:22:33
Так почему простое наследование с переопределением __init__ от frozenset не работает, а от list работает?
class mylist(list):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
mylist([1,2,3,4])
[1, 2, 3, 4]
потому что неявный super себя плохо ведет в данном случае, видимо

Nikolay
02.03.2017
15:22:48
если ты его на явный заменишь - не сработает?

Eugene
02.03.2017
15:22:49
Попробуй без super

Nikolay
02.03.2017
15:23:19
в смысле “без super()”?

Eugene
02.03.2017
15:23:52
в смысле “без super()”?
class myset(frozenset):
def __init__(self, *args, **kwargs):
frozenset.__init__(self, *args, **kwargs)

Nikolay
02.03.2017
15:24:04


Александр
02.03.2017
15:24:18
Вообще в питоне настолько богатые возможности по сигнатуре функций, что если надо что-то инспектить, связанное с ними - это всегда возня.
Ну, например, "Написать функцию, которой можно передавать аргументы либо списком/кортежем, либо по одному. Функция производит суммирование всех аргументов."
Думал, что это проще. Но пока наваял так. Есть ли тут проблемы?
# -*- coding: utf-8 -*-
import numbers
import decimal
def sum(*args):
"""Return sum numbers.
Args:
args: tuple of items.
Could be passed tuple of numbers or just set of numbers.
Returns:
sum of numbers.
"""
s = 0
for arg in args:
if isinstance(arg, tuple):
for i in arg:
if isinstance(i, numbers.Number):
s += i
else:
raise (TypeError("'{}' is not a tuple or a number".format(i)))
elif isinstance(arg, numbers.Number):
s += arg
else:
raise (TypeError("'{}' is not a tuple or a number".format(arg)))
return s
l = (5,0,5,1,9,1,5,0,5)
print sum(l)
print sum(5,0,5,1,9,1,5,0,5)
print sum(5,0,5,1,9,1,5,0,'this sucks')


Eugene
02.03.2017
15:24:38

Nikolay
02.03.2017
15:25:15
Поясни
ну, в new-style классах так писать нельзя, надо юзать super()

Google

Nikolay
02.03.2017
15:25:25
в old-style - там да, только так

Eugene
02.03.2017
15:25:56

Nikolay
02.03.2017
15:26:09

Eugene
02.03.2017
15:26:41
Я знаю как это починить, но я реально не знаю, ПОЧЕМУ с иммутабельными типами такие грабли. С tuple то же самое.

Nikolay
02.03.2017
15:30:09
вкратце - потому что immutable-объекты создаются через __new__ метаклассом, а не через __init__

GNU/Docker
02.03.2017
15:35:08
Explicit Python in a nutshell

Eugene
02.03.2017
15:35:09
Ага, вот так работает:
class myset(frozenset):
def __new__(cls, *args, **kwargs):
return super(frozenset, cls).__new__(*args, **kwargs)
def __init__(self, *args, **kwargs):
# myset init
pass
И вот спросят такое на собеседовании, сколько процентов ответит правильно? :)

GNU/Docker
02.03.2017
15:35:54
я бы сказал что не надо наследоваться от билтин типов.

Admin
ERROR: S client not available

GNU/Docker
02.03.2017
15:36:06
Для большенства задач интерфейсы есть в collections

Nikolay
02.03.2017
15:38:32
я знаю еще один WAT в питоне

GNU/Docker
02.03.2017
15:38:53

Nikolay
02.03.2017
15:39:10
суть генератора в том, что по нему можно пройти один раз и потом при попытке обратиться получать StopIteration
так?

GNU/Docker
02.03.2017
15:39:15
http://www.kr41.net/2016/03-23-dont_inherit_python_builtin_dict_type.html

Nikolay
02.03.2017
15:40:15

GNU/Docker
02.03.2017
15:40:32
Но не это его суть же!

Google

Nikolay
02.03.2017
15:40:34
но вот какая штука
инстансы xrange()/range() позволяют по ним проходить сколько угодно раз
In [5]: a = range(10)
In [6]: list(a)
Out[6]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
In [7]: list(a)
Out[7]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
то есть то, что они бросают StopIteration, вовсе не значит, что объект исчерпался и вернул управление

Eugene
02.03.2017
15:42:20
Это их фича :)

Nikolay
02.03.2017
15:42:32
ненужное послабление

Eugene
02.03.2017
15:43:22
Если ты делаешь свой итератор, тоже в методе iter можешь вернуть не self
И это нормально

Nikolay
02.03.2017
15:44:00
можешь, но это противоречит дзену питона
неявное поведение слишком
а по поводу наследования от дикта ща вброшу

GNU/Docker
02.03.2017
15:44:48
Что-то знания языка не вижу, а вижу только вбросы.

Nikolay
02.03.2017
15:45:08
class Bunch(dict):
def __init__(self, *args, **kwargs):
self.__dict__ = self
super().__init__(*args, **kwargs)

Valery
02.03.2017
15:46:00

Nikolay
02.03.2017
15:46:19
А не эбанёт?
я видел статью, в которой это как паттерн проектирования выдавалось :)
по сути что-то типа namedtuple

Valery
02.03.2017
15:46:49
Хм, получается забавный эффект))
Примерно так же себя ведут объекты в JS