ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-09-15 23:58:37  阅读:158  来源: 互联网

标签:python local-variables


我试图在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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有