本文作者:一个程序猿[1]
利用外部模块构建自定义函数或者在你的 web3 实例中导入第三方插件
最新版Web3.py[2] (v5.29.0) 支持外部模块!利用外部模块,可以自定义函数或将第三方插件导入 Web3 实例。这个功能可能是 web3.py 集成一次性的非标准的 JSON-RPC 方法或者整个 L2 API 的一种优雅的方法。
用法
有几种方法引入外部模块用:
1)在实例化 Web3.py 实例时引入:
代码语言:javascript复制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 调用都添加一些行为,那么创建一些自定义中间[3]件可能更合适。
安全第一!
在考虑第三方模块时,请谨慎再谨慎,只用那些你绝对信任的!
原文链接:https://snakecharmers.ethereum.org/web3-py-patterns-external-modules/
参考资料
[1]
一个程序猿: https://learnblockchain.cn/people/9
[2]
Web3.py: https://web3py.readthedocs.io/en/stable/index.html
[3]
自定义中间: https://web3py.readthedocs.io/en/stable/internals.html#middlewares