web3.py createFilter: filter => SyntaxError: позиционный аргумент следует за аргументом ключевого слова

  • Web3.py версии 4.2.1
  • гет версия:1.8.0-unstable

Я следовал руководству web3.py по фильтрации.

Через API экземпляра контракта:

event_filter = mycontract.events.myEvent.createFilter(fromBlock='latest', {'filter':{'arg1':10}})

Но я получаю ошибку для этой строки:

myContract.events.LogJob.createFilter(fromBlock='latest', {'filter': {'arg1':10}})

Моя основная цель — фильтрация событий на основе их аргументов.

Ошибка у меня:

myContract.events.LogJob.createFilter(fromBlock='latest', {'filter': {'arg1':10}})
                                                                 ^
SyntaxError: positional argument follows keyword argument

[В] Как исправить эту ошибку?


Обновление: я следил за ответом @Mikko Ohtamaa. Теперь я не получаю никакой ошибки, но фильтр возвращает значение, []даже если я указываю правильное ключевое слово события (словарь имени аргумента и его значения).

Пожалуйста, посмотрите пример:

blockReadFrom = 1899201;
myFilter = eBlocBroker.events.LogJob.createFilter(fromBlock=blockReadFrom)
print(myFilter.get_all_entries())

Возвращает, здесь вы можете видеть, что есть сгенерированное событие с 'storageID': 0под AttributeDict:

[AttributeDict({'address': '0x128c9F368F12C24Cc2a4f88dCDCf3daA13C9667e', 'transactionHash': HexBytes('0x8f7c50fe276057ea90985be6d14dc7abb79ee0430c66bd161861b582b7db0c97'), 'args': AttributeDict({'desc': 'Science', 'jobKey': 'QmRsaBEGcqxQcJbBxCi1LN9iz5bDAGDWR6Hx7ZvWqgqmdR', 'index': 21, 'storageID': 0, 'clusterAddress': '0x75A4c787c5c18C587B284a904165Ff06a269B48C'}), 'transactionIndex': 0, 'event': 'LogJob', 'blockHash': HexBytes('0x9782cb281aa72defe54e0f84055a03a0b1bf6c6f21bd3d276a1252098f83c15f'), 'logIndex': 0, 'blockNumber': 1899201})]

blockReadFrom = 1899201;
myFilter = eBlocBroker.events.LogJob.createFilter(fromBlock=blockReadFrom, argument_filters={'storageID':0})
print(myFilter.get_all_entries())

Возвращает:

[]

И интересно, что следующая строка возвращает правильный вывод, даже если { 'arg1': 999или 'arg111': 999т. д.} не существует.

myFilter = eBlocBroker.events.LogJob.createFilter(fromBlock=blockReadFrom, argument_filters={'arg1': 999})


Примечание:

Для получения дополнительной информации следуйте этой закрытой проблеме: https://github.com/ethereum/web3.py/issues/943#event-1723643072 .

Ответы (1)

Я думаю, что это должно быть:

  myContract.events.LogJob.createFilter(fromBlock='latest', argument_filters={'arg1':10})

Вы можете увидеть фактическую сигнатуру функции здесь:

https://web3py.readthedocs.io/en/latest/contracts.html?highlight=createfilter

Пожалуйста, сообщите о проблеме со страницей документации web3.py, так как она не отражает текущую кодовую базу.

Должно arg1быть ключевое слово, определенное под событием? Теперь он не выдает никакой ошибки, но возвращает, []даже если я указываю правильное ключевое слово события (словарь имени аргумента и его значения). Пожалуйста, смотрите мой обновленный ответ @Mikko Ohtamaa
Для получения дополнительной информации следуйте этой закрытой проблеме: github.com/ethereum/web3.py/issues/943#event-1723643072 .