有没有办法从一个类(或从另一个函数中,事实上)中定义一个全局函数?类似于定义全局变量的东西。
答案 0 :(得分:23)
将函数添加到当前命名空间,就像添加任何其他名称一样。这意味着您可以在函数或方法中使用global
关键字:
def create_global_function():
global foo
def foo(): return 'bar'
这同样适用于班级主体或方法:
class ClassWithGlobalFunction:
global spam
def spam(): return 'eggs'
def method(self):
global monty
def monty(): return 'python'
区别在于spam
将被立即定义为导入时执行顶级类主体。
与global
的所有用法一样,您可能想重新考虑问题并找到解决问题的另一种方法。例如,你可以返回这样创建的函数。
演示:
>>> def create_global_function():
... global foo
... def foo(): return 'bar'
...
>>> foo
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'foo' is not defined
>>> create_global_function()
>>> foo
<function foo at 0x102a0c7d0>
>>> foo()
'bar'
>>> class ClassWithGlobalFunction:
... global spam
... def spam(): return 'eggs'
... def method(self):
... global monty
... def monty(): return 'python'
...
>>> spam
<function spam at 0x102a0cb18>
>>> spam()
'eggs'
>>> monty
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'monty' is not defined
>>> ClassWithGlobalFunction().method()
>>> monty()
'python'
答案 1 :(得分:8)
您可以使用global从类中声明全局函数。这样做的问题是你不能在类范围内使用它,所以不妨在类之外声明它。
class X:
global d
def d():
print 'I might be defined in a class, but I\'m global'
>> X.d
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'X' object has no attribute 'd'
>> d()
I might be defined in a class, but I'm global
答案 2 :(得分:0)
我发现一种情况,其中global并没有达到预期的效果:.pdbrc文件中。如果在.pdbrc中定义函数,则只能从调用pdb.set_trace()的堆栈框架中使用它们。
但是,您可以全局添加一个函数,以便使用替代语法在所有堆栈框架中都可用:
def cow(): print("I'm a cow")
globals()['cow']=cow
我已经测试过,至少在最简单的情况下,它也可以代替global关键字:
def fish():
def cow():
print("I'm a cow")
globals()['cow']=cow
尽管较为冗长,但我认为值得分享这种替代语法。我尚未对其进行广泛的测试,因此无法对它的局限性和使用global关键字进行评论。