为什么Python不能从外部访问子功能?

时间:2012-10-06 05:07:13

标签: python

def A():
    def B():
        #do something

a = A()
a.B()

为什么Python中没有上述(如此简单的代码)?是否有一个'pythonic'(清晰易读,不引人注意,非hacky)的解决方法,不会将A()变成一个类?

编辑1:上面向我解释说B是A的本地,因此只有在评估A时它才存在。因此,如果我们将其设为全局(并确保不会覆盖它),那么为什么这不起作用呢?

def A():
    def B():
        #do something
    return A()

a = A()
a.B()

它说它正在返回一个'NoneType'对象。

2 个答案:

答案 0 :(得分:7)

因为函数定义只是在本地名称空间中创建一个名称。你在做什么与:

def f():
    a = 2

然后询问为什么你不能从函数外部访问a。绑定在函数内的名称是函数的本地名称。

此外,您提出的代码很奇怪。当您执行a = f()时,您正在设置函数的返回值。你的函数什么都不返回,所以你不能希望通过返回值访问任何东西。可以直接返回内部函数:

def f():
   def g():
      return "blah"
   return g

>>> func = f()
>>> func()
'blah'

这确实很有用。但是除了通过修改全局变量(这通常是一个坏主意)或返回值之外,没有通用的方法从外部访问函数内部的东西。这就是函数的工作方式:它们接受输入和返回输出;他们不会把他们的内脏提供给外面的词。

答案 1 :(得分:5)

要使用您想要的语法调用B,请使用:

def A():
    def B():
        print("I'm B")
    A.B = B
    return A

a = A()
a.B()
A.B()