Обзвон с одиночной рассылкой - PullRequest
1 голос
/ 30 сентября 2019

Мне любопытно, возможно ли эмулировать нормальный вызов super().method() для вызова "родителя" method(), но с использованием singledispatch вместо полиморфизма метода.

Насколько я могускажите, ответ "нет". Я не думаю, что индексирование в MRO является жизнеспособным решением, но может быть неправильным.

from functools import singledispatch

class A:
  pass

class B(A):
  pass

@singledispatch
def f(obj):
    raise NotImplementedError(obj)

@f.register(A)
def _(obj):
  print('A')

@f.register(B)
def _(obj):
  print('B')
  f.dispatch(super(B, obj))

b = B()
# I want this to print "B" then "A"
f(b)

Вывод

B
Traceback (most recent call last):
  File "main.py", line 29, in <module>
    f(b)
  File "/usr/local/lib/python3.7/functools.py", line 840, in wrapper
    return dispatch(args[0].__class__)(*args, **kw)
  File "main.py", line 24, in _
    f.dispatch(super(B, obj))
  File "/usr/local/lib/python3.7/functools.py", line 795, in dispatch
    impl = dispatch_cache[cls]
  File "/usr/local/lib/python3.7/weakref.py", line 396, in __getitem__
    return self.data[ref(key)]
TypeError: cannot create weak reference to 'super' object
...