簡體   English   中英

Python 模塊和全局變量

[英]Python modules and global variables

有很多類似標題的帖子,但沒有一個回答我的問題。

我有一個代碼可以對 function 進行一些分析。 function 的定義在一個模塊中,比如definition.py 假設內容是

# module definition.py
def f(x):
   return x**2

用於執行分析的所有函數都放在不同的模塊中,比如analysis.py

# module analysis.py
def factor2(x):
   return 2*f(x)

我希望主代碼看起來像這樣

# main.py
from definition import *
from analysis import *

print( factor2(3.0) )

並期望看到結果“18.0”。

請注意,我不想在 factor2 的定義中明確指定factor2 f 這不起作用。 編譯器說名稱f沒有定義。

我可以將 function factor2 定義為 factor2 factor2(f,x) ,然后傳遞參數f 但這正是我想要避免的。 這是因為整個代碼的目的是只在f上工作,並且一遍又一遍地編寫 f 是乏味的。 另外,它使代碼更長(如果有很多這樣的 f 和許多分析函數)。

有沒有辦法將f的定義從definition.py傳遞到analysis.py

analysis.py中導入definition.py並不好,因為我希望能夠通過導入不同的模塊來更改f的定義,比如definition2.py ,而無需再接觸analysis.py模塊。

正如juanpa.arrivillaga評論中解釋的那樣,最好使用部分:

Python [使用]詞法scope,您基本上是在要求動態scope。 最好的方法是將 function 作為參數傳遞。 您可以簡單地部分應用f一次,然后使用它。

例如:

from functools import partial
from definition import f

def actor2(function, x):  # "factor" without the "f" ;)
    return 2*function(x)

factor2 = partial(actor2, f)
>>> factor2(3)
18
>>> factor2  # Also here's the repr, which you wouldn't get if you used a lambda
functools.partial(<function actor2 at 0x...>, <function f at 0x...>)

juanpa 還說:

另一種選擇是使用 class 向構造函數提供f並將其用作實例屬性。

如果您要使用 class 做更多事情,這是一個不錯的選擇。 否則就過分了,就像Jack Diederich 說的那樣:

“這不應該是一個類”的簽名是它有兩個方法,其中一個是__init__ [...] 如果你發現你總是將相同的第一個參數傳遞給那個 function,嘿,標准庫有一個東西, functools.partial

暫無
暫無

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

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