@spbpython

Страница 309 из 785
Александр
02.03.2017
14:43:32
Мой пример - это нововведение в py3
а я сижу и не понимаю, почему у меня фейлится /

спасибо

Mikhail
02.03.2017
14:43:57
И почему эту функцию можно вызвать только с обязательным указанием имени для "с"? :)
Потому что иначе все переданные аргументы будут упакованы в *?

Google
Gregory
02.03.2017
14:47:11
И почему эту функцию можно вызвать только с обязательным указанием имени для "с"? :)
гмм, а звездочка в объявлении функции это же как args*, я правильно понял?

Serge
02.03.2017
14:47:53
а можно использовать другое имя, не self?
а что будет, если написать метод даже без self и неставить ему декоратор @staticmethod? как такой метод себя поведет?

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
и тоже не будет работать
а, нет, такбудет;)

Serge
02.03.2017
14:51:09
ClassName.static_method_name()
так это класс импортировать надо. а зачем?

Roman
02.03.2017
14:51:36
а можно использовать другое имя, не self?
можно даже написать fn(*args, **kwargs)

Sergey
02.03.2017
14:52:11
так это класс импортировать надо. а зачем?
дык затем что её приделали к классу, а на то есть причина

Vadim
02.03.2017
14:52:46
@filinvadim
спасибо)

Eugene
02.03.2017
14:52:59
гмм, а звездочка в объявлении функции это же как args*, я правильно понял?
Звёздочка тут не относится к имени аргумента. Она тут говорит о том, что после меня обязательно указывай имена аргументов при вызове функции, так как это kwargs

Serge
02.03.2017
14:53:44
дык затем что её приделали к классу, а на то есть причина
а какая? когда удобно делать staticmethod, чем он отличается от classmethod?

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
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
https://meduza.io/feature/2017/03/02/razrabotchik-obmanul-kapchu-google-s-pomoschyu-drugogo-servisa-google
https://www.youtube.com/watch?v=fsF7enQY8uI Вот такой способ всё равно веселее :D

Nikolay
02.03.2017
15:12:18
https://www.youtube.com/watch?v=fsF7enQY8uI Вот такой способ всё равно веселее :D
если там при этом нейросеть, которая распознала, где на экране квадратик, и кликнула на него - это круто

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: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
если ты его на явный заменишь - не сработает?
class myset(frozenset): def __init__(self, *args, **kwargs): super(frozenset, self).__init__(*args, **kwargs) То же самое TypeError: object.__init__() takes no parameters

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 в питоне

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

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

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

Google
Nikolay
02.03.2017
15:40:34
http://www.kr41.net/2016/03-23-dont_inherit_python_builtin_dict_type.html
ну, я тут не соглашусь, а еще ща чуть позже вброшу наркоманский пример

но вот какая штука

инстансы 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)

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

по сути что-то типа namedtuple

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

Примерно так же себя ведут объекты в JS

Страница 309 из 785