编程语言
首页 > 编程语言> > python – 在函数外部访问函数变量而不使用“global”

python – 在函数外部访问函数变量而不使用“global”

作者:互联网

我试图在Python中访问函数外部的本地函数变量.所以,例如,

bye = ''
def hi():
    global bye
    something
    something
    bye = 5
    sigh = 10

hi()
print bye

以上工作正常.既然我想知道我是否可以在hi()之外访问再见而不使用全局再见,我试过:

def hi():
    something
    something
    bye = 5 
    sigh = 10
    return

hi()
x = hi()
print x.bye 

上面给出了AttributeError:’NoneType’对象没有属性’bye’.

然后,我试过:

def hi():
    something
    something
    bye = 5
    sigh = 10
    return bye 
hi()
x = hi()
print x.bye

这次它甚至没有出错.

那么,是否有一种方法可以在不使用全局变量的情况下访问函数(hi())之外的本地函数变量(bye),而不打印变量叹息? (编辑问题以包括@hcwhsa在下面的评论之后的叹息.

解决方法:

您可以沿着这条线做一些事情(当我测试它/它们时,它在Python v2.7.15和v3.7.1中都有效):

def hi():
    # other code...
    hi.bye = 42  # Create function attribute.
    sigh = 10

hi()
print(hi.bye)  # -> 42

函数是Python中的对象,可以为其分配任意属性.

如果您经常要做这种事情,可以通过创建一个函数装饰器来实现更通用的东西,该函数装饰器为每个对装饰函数的调用添加一个this参数.

这个额外的参数将为函数提供一种引用自己的方法,而不需要将它显式地嵌入(硬编码)到它们的定义中,并且类似于类方法自动接收的实例参数作为它们的第一个参数,通常命名为self – 我选择了不同的东西.避免混淆,但就像自我论证一样,它可以根据你的意愿命名.

以下是该方法的一个示例:

def with_this_arg(func):
    def wrapped(*args, **kwargs):
        return func(wrapped, *args, **kwargs)
    return wrapped

@with_this_arg
def hi(this, that):
    # other code...
    this.bye = 2 * that  # Create function attribute.
    sigh = 10

hi(21)
print(hi.bye)  # -> 42

标签:python,local-variables
来源: https://codeday.me/bug/20190915/1806412.html