我的当前代码允许函数调用包装装饰器,并在其代码中使用函数名。但是,我正在寻找一种方法,以一种参数的方式给函数一个“别名”。以下是当前代码:
import os, sys
# Take user input
message = input('type command: ')
# Command wrapper
ALLCOMMANDS = {}
def command(function):
ALLCOMMANDS[function.__name__] = function
return function
# Commands
@command
def foo():
print("bar")
@command
def goo():
print('ber')
# Run appropriate command
if message in ALLCOMMANDS:
ALLCOMMANDS[message]()
例如,我希望能够调用一个名称,如'!foo'来自用户输入,所以可能参数看起来像@command(name='!foo')
,我只是不知道从那里开始在decorator中使用该参数,因为它已经有一个参数了。你知道吗
我试过了
# Command wrapper
ALLCOMMANDS = {}
def command(name):
ALLCOMMANDS[name] = name
return name
但是不断地出错,我想我遗漏了什么
您应该阅读更多关于python装饰器的内容。您遇到以下错误:
因为
return name
。你知道吗装饰者只是句法上的糖。这是:
相当于:
从这里你可以看到为什么你原来的装饰工程。最后你
return function
。你知道吗当你有一个喜欢争论的装饰师时,事情就变得有点棘手了。去除以下物质:
看起来像这样:
因此,要编写接受参数的decorator,decorator需要返回一个函数,该函数接受要修饰的函数作为参数:
还可以考虑将
ALLCOMMANDS
作为命令的属性,而不是全局属性(UPPER_SNAKE
通常是为常量保留的):相关问题 更多 >
编程相关推荐