繁体   English   中英

这与装饰者的工作方式相反吗?

[英]isnt this the opposite of how a decorator works?

昨天我们在python中升级了slackclient模块,需要根据RTM API的迁移指南更改一些代码。

https://github.com/slackapi/python-slackclient/wiki/Migrating-to-2.x

这是我的代码......

import slack

slack_token = os.environ['SLACK_BOT_TOKEN']

rtmclient = slack.RTMClient(token=slack_token)

@slack.RTMClient.run_on(event='message')
def parse_message(**payload):
    data = payload['data']
    channel_id = data['channel']
    print(data)
    print(channel_id)

rtmclient.start()

在此之前我从未使用过Python装饰器。

关于装饰阅读后,这是我的理解是,装饰slack.RTMClient.run_on如果我要调用该函数将被称为parse_message

这段代码似乎正好相反。

调用rtmclient.start()时,为什么/如何使用此代码?

不熟悉那个特定的API,但是

@slack.RTMClient.run_on(event='message')
def parse_message(**payload):
    ...

与...基本相同

def parse_message(**payload):
    ...

parse_message = slack.RTMClient.run_on(event='message')(parse_message)

调用函数时,不会调用装饰器,而是在声明函数时调用。 然后,它通常将定义并返回将被调用而不是原始函数的新函数,例如,使用额外的日志记录,memoization等。

但是,这也是完全有可能的装饰只返回功能,1的原始版本,但如寄存器功能对于一些事件的回调。

一个非常简单的例子:

my_callbacks = []
def register(f):
    my_callbacks.append(f)
    return f

@register
def foo():
    print("calling foo")


for f in my_callbacks:
    f()

1)如注释中所述, 这个装饰器似乎甚至没有返回原始函数但是None ,这意味着该函数在装饰后不再可以直接调用,只能通过回调。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM