利用外部模块可构建自定义函数或者在你的 web3 实例中导入第三方插件
利用外部模块构建自定义函数或者在你的 web3 实例中导入第三方插件
最新版Web3.py (v5.29.0) 支持外部模块!利用外部模块,可以自定义函数或将第三方插件导入 Web3 实例。这个功能可能是web3.py集成一次性的非标准的JSON-RPC方法或者整个L2 API的一种优雅的方法。
有几种方法引入外部模块用:
1)在实例化 Web3.py 实例时引入:
from web3 import Web3, HTTPProvider
from my_custom_modules import ExampleModule
w3 = Web3(
HTTPProvider(...),
external_modules={'example': ExampleModule}
)
w3.example.example_method()
2)或者,在 Web3.py 实例上用attach_modules
方法:
w3.attach_modules({'example': ExampleModule})
w3.example.example_method()
外部模块只需是一个类。如果需要引用父 Web3 实例,它会作为__init__
函数的第一个也是唯一的参数传入。下面是一个简单的示例,它包含一个模块 (HoopersModule
) ,其中一个子模块(ShaqModule
)使用了Web3
例:
import random
class HoopersModule():
def set_strategy(self):
print('foul!' if random.choice([True, False]) else 'flop!')
class ShaqModule():
def __init__(self, w3):
self.w3 = w3
def print_balance(self):
wei_balance = self.w3.eth.get_balance('shaq.eth')
print(self.w3.fromWei(wei_balance, 'ether'))
w3.attach_modules({'hoopers': (HoopersModule, {'shaq': ShaqModule})})
w3.hoopers.set_strategy()
# flop!
w3.hoopers.shaq.print_balance()
# 0.271887362722036121
如简介中所述,外部模块是在Web3
实例中引入新 API 的好方法。但是,有些情况更适合用中间件。比如果你想为每个现有的 RPC 调用都添加一些行为,那么创建一些自定义中间件可能更合适。
在考虑第三方模块时,请谨慎再谨慎,只用那些你绝对信任的!
原文链接:https://snakecharmers.ethereum.org/web3-py-patterns-external-modules/
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!