我想在python中创建一个包含@‘命令’的模块,我正在考虑一些类似于单击库的内容,比如这个@click.command()。我只是不确定我是否会用一个类或其他什么东西来做这个。
我试过使用类,但这些类的行为似乎与@命令不同。
发布于 2022-03-28 13:32:09
为了有一个装潢器,您需要一个可调用的参数。
例如:
def trivial_decorator(f):
return f您现在可以这样使用它:
@trivial_decorator
def my_function():
print('hi')..。相当于:
def my_function():
print('hi')
my_function = trivial_decorator(my_function)当然,它还没有做任何有用的事情。
假设您希望跟踪一个函数列表,您可以这样做:
FUNCTION_REGISTRY = []
def register(func):
FUNCTION_REGISTRY.append(func)
return func现在,您可以在所有要注册的函数前面添加@register。
或者您可能想用函数的参数或返回值来做一些事情。
假设您希望能够编写一个函数,将两个数字相加在一起,但像add('5', '10')一样调用它来获取15。
你可以这样做:
def intify_args(func):
def second_func(arg1, arg2):
return func(int(arg1), int(arg2))
return second_func
@intify_args
def add(arg1, arg2):
return arg1 + arg2现在,在装饰器中返回一个不同的函数。这是可行的,但是如果您尝试执行类似于help(add)的操作,您会注意到Python认为函数应该被称为second_func而不是add。要解决这个问题,Python实际上有一个名为functools.wraps的装饰器,用于更新函数的文档,因此您可以执行以下操作:
import functools
def intify_args(func):
@functools.wraps(func)
def second_func(arg1, arg2):
return func(int(arg1), int(arg2))
return second_func装饰师是一个非常方便的工具,在你的思维工具箱,我几乎总是有一个地方装饰师真正简化了我的代码。我最喜欢的(老实说,我认为应该在标准图书馆)是这样的:
def join(f):
@functools.wraps(f)
def _(*args, **kwargs):
return ''.join(map(str, f(*args, **kwargs)))
return _它允许您构造字符串生成器函数,如下所示:
@join
def make_some_string(one, two):
yield '('
yield frobnicate(one)
yield from blorbo(two)
yield ')'
# call it like make_some_string(1, 2) to get a string that is all those elements joined together一开始,它们可能有点棘手,但我建议您先看看functools.wraps和click.command这样的装潢师的源代码来了解它们。
https://stackoverflow.com/questions/71647835
复制相似问题