[英]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.