首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >函数闭包和对象名中<locals>语法的含义

函数闭包和对象名中<locals>语法的含义
EN

Stack Overflow用户
提问于 2022-01-14 04:28:28
回答 2查看 86关注 0票数 3

假设我有以下代码:

代码语言:javascript
运行
复制
def outer(information):
    print(locals())
    def inner():
        print("The information given to me is: ", information)
    return inner


func1 = outer("info1")
print(func1)

它返回:

代码语言:javascript
运行
复制
{'information': 'info1'}
<function outer.<locals>.inner at 0x1004d9d30>

当然,如果我调用func1,它将在语句中使用info1进行打印。因此,通过在外部函数中打印局部变量(),我可以看到局部作用域与参数的存储之间存在某种关系。

我原以为func1只是outer.inner,为什么语法说outer.<locals>.inner呢?这是否是一种语法方法来澄清每个函数都有不同的局部作用域--假设我做了另一个func2 = outer("info2") --我使用外部函数返回?

此外,在名称周围使用<>语法有什么特别之处吗?我在物体和本地人周围都看到了。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-01-14 04:53:10

参见PEP 3155 -类和函数的限定名称具有嵌套函数的示例

对于嵌套类、方法和嵌套函数,__qualname__属性包含从模块顶层指向对象的虚线路径。函数的本地命名空间由名为<locals>的组件在虚线路径中表示。

因为函数的__repr__使用__qualname__属性,所以在打印嵌套函数时,您会在输出中看到这个额外的组件。

我原以为func1只是outer.inner

这不是一个完全合格的名字。使用这个repr,您可能会错误地假设您可以导入名称outer并动态访问属性inner。记住,质量名是“指向对象的虚线路径”,但在这种情况下,属性访问是不可能的,因为inner是一个局部变量。

此外,在名称周围使用<>语法有什么特别之处吗?

它没有什么特别之处,但它给程序员一个非常强烈的提示:您不能直接访问这个名称空间,因为名称不是有效标识符

票数 2
EN

Stack Overflow用户

发布于 2022-01-14 04:39:31

您可以将outer.<locals>.inner看作是说内部是由函数创建的局部变量。inner指的是计算机科学中的闭包。粗略地说,闭包就像lambda,因为它充当一个函数,但它需要将非全局数据捆绑在一起才能运行。在内存中,它充当信息和被调用函数的引用之间的元组。

代码语言:javascript
运行
复制
foo = outer("foo")
bar = outer("bar")

# In memory these more or less looks like the following:
("foo", outer.inner)
("bar", outer.inner)

# And since it was created from a local namespace and can not be accessed
# from a static context local variables bundled with the function, it
# represents that by adding <local> when printed.

# While something like this looks a whole lot more convenient, it gets way
# more annoying to work with when the local variables used are the length of
# your entire terminal screen.
<function outer."foo".inner at 0x1004d9d30>

<>本质上没有什么特别之处,只有告诉您<local>有一些特殊的含义。

编辑:

我在编写答案时并不完全确定,但在看到@wim的答案之后,<local>不仅适用于本地上下文中创建的消费变量的闭包。它可以更广泛地应用于在本地命名空间中创建的所有函数(或任何其他函数)。总之,foo.<local>.bar仅仅意味着"bar是在foo的本地命名空间中创建的“。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70706034

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档