(Микро-) Функция обратного вызова Python внутри класса выдает ошибку типаPython

Программы на Python
Anonymous
(Микро-) Функция обратного вызова Python внутри класса выдает ошибку типа

Сообщение Anonymous »

Я более или менее новичок в Python и все еще немного борюсь с ООП (исходя из C, а не C++).
Я хочу повторно использовать и расширить класс вращающегося энкодера и просто хотел добавить переключатель с помощью процедура обратного вызова прерывания. Но всегда выдает ошибку:

Код: Выделить всё

from rotary_encoder.rotary_irq_esp import RotaryIRQ
from machine import Pin

class RotaryEncoder(RotaryIRQ):
# rotary options
RANGE_MODE = const(1) # 1->UNBOUNDED, 2->WRAP, 3->BOUNDED
PIN_CLK = const(7)
PIN_DT = const(8)
PULL_UP = True

# switch options
PIN_SWITCH = const(6)
PULL_UP_SWITCH = True

def __init__(self, pin_num_clk=PIN_CLK, pin_num_dt=PIN_DT, min_val=0, max_val=10, incr=1,range_mode=RANGE_MODE, pull_up=PULL_UP,pin_switch=PIN_SWITCH,pull_up_switch=PULL_UP_SWITCH):
super().__init__(pin_num_clk, pin_num_dt, min_val, max_val, incr, range_mode, pull_up)
# add switch
if pull_up_switch:
self.switch = Pin(pin_switch,Pin.IN, Pin.PULL_UP)
self.switch.irq(trigger=Pin.IRQ_FALLING, handler=self._rotary_switch_callback)
else:
self.switch = Pin(pin_switch,Pin.IN, Pin.PULL_DOWN)
self.switch.irq(trigger=Pin.IRQ_RISING, handler=self._rotary_switch_callback)

def _rotary_switch_callback(self):
pass
Знаете ли вы, почему это не работает??
Ошибка:
TypeError: функция принимает 1 позиционный аргумент, но 2 были заданы
Я попробовал несколько вещей, но ничего не помогло.
В другом компоненте я увидел определение функции обратного вызова внутри класса без аргумента (self). Здесь это также не сработает (и, кстати, меня очень смущает, почему функция внутри класса, которая не является статическим методом или методом класса, существует без аргумента (self) - но это уже другая тема :-)
Я пробовал

Код: Выделить всё

handler=self._rotary_switch_callback)
handler=_rotary_switch_callback)

def _rotary_switch_callback(self):
def _rotary_switch_callback():

Если я использую код вне класса, он работает, но дополнительным аргументом является сам экземпляр. Понятия не имею, как мне перенести это в класс.

Код: Выделить всё

def rotary_switch_callback(rotary_switch):
pass
rotary_switch = Pin(6,Pin.IN, Pin.PULL_UP)
rotary_switch.irq(trigger=Pin.IRQ_FALLING, handler=rotary_switch_callback)
Если я сделаю следующее, это (конечно) не сработает :-)

Код: Выделить всё

self.switch = Pin(pin_switch,Pin.IN, Pin.PULL_DOWN)
self.switch.irq(trigger=Pin.IRQ_RISING, handler=self._rotary_switch_callback)

def _rotary_switch_callback(self, self.switch):
pass
Я понятия не имею, почему это не работает, но думаю, что не могу передать экземпляр экземпляра в качестве аргумента, если аргументом является сам экземпляр. Есть идеи, как я могу решить эту проблему «правильным» способом без уродливых трюков?

Подробнее здесь: https://stackoverflow.com/questions/786 ... type-error

Вернуться в «Python»