Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在装饰器中通过别名调用函数_Python_Function_Decorator - Fatal编程技术网

Python 在装饰器中通过别名调用函数

Python 在装饰器中通过别名调用函数,python,function,decorator,Python,Function,Decorator,我的当前代码允许函数调用包装装饰器,并在其代码中使用函数名。但是,我正在寻找一种方法,以参数的形式为函数指定一个“别名”。以下是当前代码: import os, sys # Take user input message = input('type command: ') # Command wrapper ALLCOMMANDS = {} def command(function): ALLCOMMANDS[function.__name__] = function ret

我的当前代码允许函数调用包装装饰器,并在其代码中使用函数名。但是,我正在寻找一种方法,以参数的形式为函数指定一个“别名”。以下是当前代码:

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')
,我只是不知道从那里开始在装饰器中使用该参数,因为它已经有一个参数了

我试图

# Command wrapper
ALLCOMMANDS = {}
def command(name):
    ALLCOMMANDS[name] = name
    return name

但是不断出现错误,我想我遗漏了一些东西,你应该多读一些关于python装饰器的内容。您在以下方面遇到错误:

def command(name):
    ALLCOMMANDS[name] = name
    return name
因为
返回名称

装饰者只是语法上的糖。这:

@command
def foo():
    print('bar')
相当于:

def foo():
    print('bar')

foo = command(foo)
从这里你可以看到为什么你原来的装饰工程。最后,返回函数

当你有一个接受参数的装饰师时,事情会变得有点棘手。删除以下内容:

@command('nickname')
def foo():
    print('bar')
看起来像这样:

def foo():
    print('bar')

foo = command('nickname')(foo)
因此,要编写接受参数的装饰器,装饰器需要返回一个将要装饰的函数作为参数的函数:

def command(nickname):
    def wrapped(f):
        ALLCOMMANDS[nickname] = f
        return f
    return wrapped

还考虑制作<代码> ALLCODES < /C> >您的命令上的属性而不是全局的(<代码> UpPixSngs<代码>通常保留为常量):


您应该阅读更多关于python装饰器的内容。您在以下方面遇到错误:

def command(name):
    ALLCOMMANDS[name] = name
    return name
因为
返回名称

装饰者只是语法上的糖。这:

@command
def foo():
    print('bar')
相当于:

def foo():
    print('bar')

foo = command(foo)
从这里你可以看到为什么你原来的装饰工程。最后,返回函数

当你有一个接受参数的装饰师时,事情会变得有点棘手。删除以下内容:

@command('nickname')
def foo():
    print('bar')
看起来像这样:

def foo():
    print('bar')

foo = command('nickname')(foo)
因此,要编写接受参数的装饰器,装饰器需要返回一个将要装饰的函数作为参数的函数:

def command(nickname):
    def wrapped(f):
        ALLCOMMANDS[nickname] = f
        return f
    return wrapped

还考虑制作<代码> ALLCODES < /C> >您的命令上的属性而不是全局的(<代码> UpPixSngs<代码>通常保留为常量):


如果你遵循这个,你应该能够传递一个名称参数:如果你遵循这个,你应该能够传递一个名称参数:啊,有意义。感谢您提供的详细帮助,我将实施这些建议SAH,很有意义。感谢您提供的详细帮助,我将实施这些建议