簡體   English   中英

如何在Python中定義全局函數?

[英]How to define global function in Python?

有沒有一種方法可以將一個函數定義為在一個類中是全局的(或者,實際上是在另一個函數中)? 類似於定義全局變量。

將函數添加到當前名稱空間,就像將添加任何其他名稱一樣。 這意味着您可以在函數或方法中使用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'

您可以使用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

我發現了一種情況,其中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關鍵字進行評論。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM