Страница 1 из 1

Вопрос по 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})

Как его понимать, как оно должно выполняться?

Re: Вопрос по Python

СообщениеДобавлено: 04.05.2016 10:32:31
alexs
а что такое - self
Что в него передаётся при вызове? Посмотри по коду - кто вызвает твою proc и что отдаёт ей в качестве первого параметра

Re: Вопрос по Python

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

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

Забыл еще добавить, питон 2.7, в версии 3 может что-то другое быть.

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__

Re: Вопрос по Python

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

Re: Вопрос по Python

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

Мне не нравится слово "подставляется", скорее "передаётся", потому что внутри __call__ переданные v и d могут быть модифицированы. И плюс не могу исключать возможность какого-то экзотического назначения данного кода. А в целом -- да, всё так.

Re: Вопрос по Python

СообщениеДобавлено: 04.05.2016 13:20:53
Снег Север
Дож, спасибо.