Web3.py(v5.29.0)支持外部模块

2022-05-25 16:19:57 浏览数 (1)

本文作者:一个程序猿[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方法:

代码语言:javascript复制
w3.attach_modules({'example': ExampleModule})

w3.example.example_method()

创建外部模块

外部模块只需是一个类。如果需要引用父 Web3 实例,它会作为__init__函数的第一个也是唯一的参数传入。下面是一个简单的示例,它包含一个模块 (HoopersModule) ,其中一个子模块(ShaqModule)使用了Web3例:

代码语言:javascript复制
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

0 人点赞