Вопрос по Python

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Вопрос по Python

Сообщение Снег Север » 04.05.2016 10:24:21

Вопрос по Python
Решил на досуге разобраться с Python, как с потенциальным скриптовым языком в дельфийских/лазарусовских программах.
Встретил одно непонятное место, прежде чем идти регистрироваться на специализированные форумы, решил спросить здесь.
В программе есть функция объекта такого вида:
Код: Выделить всё
def proc(self, v, d, c, vc):
"""
        @type  v: sequence
        @type  d: dict
        @type  c: list
        @type  vc: dict
        """#"""
        if len(v) == 1:
            var = v[0]
            dom = d[variable]
            for value in dom[:]:
                if not self(v, d, {var: value}):
                    dom.remove(value)
            c.remove((self, v))
            vc[var].remove((self, vari))

Мне непонятно выражение в операторе if -
if not self(v, d, {var: value})

Как его понимать, как оно должно выполняться?
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

Re: Вопрос по Python

Сообщение alexs » 04.05.2016 10:32:31

а что такое - self
Что в него передаётся при вызове? Посмотри по коду - кто вызвает твою proc и что отдаёт ей в качестве первого параметра
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4053
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Вопрос по Python

Сообщение Снег Север » 04.05.2016 10:45:46

alexs писал(а):а что такое - self
self - это сам объект, т.е. его вызов означает, что значения параметров подставляются из самого объекта (примерно как обращение по ссылке в паскале). Объект описан как:
Код: Выделить всё
class Cn(object):

в нем ровно три функции
call - всегда возвращает true
proc - которую я разбираю
и еще одна, которая не имеет к первым двум отношения.
Насколько я понимаю, эти функции некий аналог class function из паскаля.

Забыл еще добавить, питон 2.7, в версии 3 может что-то другое быть.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

Re: Вопрос по Python

Сообщение Дож » 04.05.2016 11:46:07

Значит, предполагается, что объект callable (т.е. у него определён метод __call__), иначе просто вылетит соответствующая ошибка:
Код: Выделить всё
variable = 1

class Cn(object):
  def proc(self, v, d, c, vc):
    if len(v) == 1:
      var = v[0]
      dom = d[variable]
      for value in dom[:]:
          if not self(v, d, {var: value}):
              dom.remove(value)
      c.remove((self, v))
      vc[var].remove((self, vari))


c = Cn()
c.proc({0: 0}, {1: "hello"}, {}, {})

Код: Выделить всё
$ python test.py
Traceback (most recent call last):
  File "test.py", line 16, in <module>
    c.proc({0: 0}, {1: "hello"}, {}, {})
  File "test.py", line 9, in proc
    if not self(v, d, {var: value}):
TypeError: 'Cn' object is not callable


«{var: value}» — это словарь из одной пары.

self - это сам объект, т.е. его вызов означает, что значения параметров подставляются из самого объекта (примерно как обращение по ссылке в паскале).

Этого недостаточно для понимания кода, нужно ещё смотреть как в коде вызывается proc. Возможно, что proc вызывается для наследника Cn, в котором определён метод __call__
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Вопрос по Python

Сообщение Снег Север » 04.05.2016 12:53:42

Дож, т.е. это проверка на значение __call__ наследника, в который подставляется sequence, dict и словарь из одной пары? Если да, то тогда мне понятно.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

Re: Вопрос по Python

Сообщение Дож » 04.05.2016 13:06:06

Снег Север писал(а):Дож, т.е. это проверка на значение __call__ наследника, в который подставляется sequence, dict и словарь из одной пары? Если да, то тогда мне понятно.

Мне не нравится слово "подставляется", скорее "передаётся", потому что внутри __call__ переданные v и d могут быть модифицированы. И плюс не могу исключать возможность какого-то экзотического назначения данного кода. А в целом -- да, всё так.
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Вопрос по Python

Сообщение Снег Север » 04.05.2016 13:20:53

Дож, спасибо.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47


Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10

Рейтинг@Mail.ru