【问题标题】:How to pass string from function into decorator?如何将字符串从函数传递到装饰器?
【发布时间】:2020-04-23 11:11:30
【问题描述】:

我想从函数中获取输入:

def input_text():
    text = input('Type the text:\n')
    # deco_required = input('Format variable\n')
    return text

然后我想要一个装饰器来格式化上面输入的文本:

def center(input_text):
    def centering(*args,**kwargs):
        t = '<center>{}</center>' .format(kwargs)
        return input_text
    return centering

我认为这是正确的做法:

@centring
input_text()

我收到以下错误:

File "<ipython-input-10-95c74b9f0757>", line 2
    input_text()
             ^ SyntaxError: invalid syntax

这对我查找不是很有帮助。

【问题讨论】:

  • 你装饰了一个函数定义,而不是一个调用。如果您想在调用时将装饰器应用于函数,则需要执行例如center(input_text)()。但请注意,您的装饰器本身也没有意义,您从调用包装函数获得输入,not 来自对包装器的调用。
  • 你需要查看你的代码,有拼写错误的函数名(“centring”)和多余的空格(在.format(kwargs)之前。我还假设你想返回t,而不是@ 987654328@centering

标签: python python-decorators


【解决方案1】:

首先,如果没有装饰器,您只需将input_text 的返回值传递给居中函数即可。

def centering(s):
    return '<center>{}</center>'.format(s)

centered_text = centering(input_text)

为您执行此操作的函数可能如下所示

def input_centered_text():
    text = input('Temp the text:')
    centered_text = centering(text)
    return centered_text

可以从原始 input_text 生成 input_centered_text 的装饰器看起来像

def center(f):
    def _():
        centered_text = f()
        return centered_text
    return _

也可以使用

def input_text():
    text = input('Type the text:\n')
    return text


input_centered_text = center(input_text)

或

@center
def input_centered_text():  # Note the change in the function name
    text = input('Type the text:\n')
    return text

【讨论】:

  • 谢谢。我给出的例子只是为了理解这个概念。我想我现在更好地理解了这个概念。
猜你喜欢
  • 2021-11-21
  • 2021-11-15
  • 1970-01-01
  • 2016-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-06
  • 2010-12-30
相关资源
最近更新 更多