首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用python制作@功能

用python制作@功能
EN

Stack Overflow用户
提问于 2022-03-28 12:57:58
回答 1查看 41关注 0票数 -1

我想在python中创建一个包含@‘命令’的模块,我正在考虑一些类似于单击库的内容,比如这个@click.command()。我只是不确定我是否会用一个类或其他什么东西来做这个。

我试过使用类,但这些类的行为似乎与@命令不同。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-28 13:32:09

为了有一个装潢器,您需要一个可调用的参数。

例如:

代码语言:javascript
复制
def trivial_decorator(f):
    return f

您现在可以这样使用它:

代码语言:javascript
复制
@trivial_decorator
def my_function():
    print('hi')

..。相当于:

代码语言:javascript
复制
def my_function():
    print('hi')

my_function = trivial_decorator(my_function)

当然,它还没有做任何有用的事情。

假设您希望跟踪一个函数列表,您可以这样做:

代码语言:javascript
复制
FUNCTION_REGISTRY = []

def register(func):
    FUNCTION_REGISTRY.append(func)
    return func

现在,您可以在所有要注册的函数前面添加@register

或者您可能想用函数的参数或返回值来做一些事情。

假设您希望能够编写一个函数,将两个数字相加在一起,但像add('5', '10')一样调用它来获取15

你可以这样做:

代码语言:javascript
复制
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的装饰器,用于更新函数的文档,因此您可以执行以下操作:

代码语言:javascript
复制
import functools

def intify_args(func):
    @functools.wraps(func)
    def second_func(arg1, arg2):
        return func(int(arg1), int(arg2))
    return second_func

装饰师是一个非常方便的工具,在你的思维工具箱,我几乎总是有一个地方装饰师真正简化了我的代码。我最喜欢的(老实说,我认为应该在标准图书馆)是这样的:

代码语言:javascript
复制
def join(f):
    @functools.wraps(f)
    def _(*args, **kwargs):
        return ''.join(map(str, f(*args, **kwargs)))
    return _

它允许您构造字符串生成器函数,如下所示:

代码语言:javascript
复制
@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.wrapsclick.command这样的装潢师的源代码来了解它们。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71647835

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档