2012-09-14 63 views
2

我不是一個真正的程序員,而是一名計算統計學家,所以我可能會理解複雜的算法,但不是簡單的編程構造。Python:從模塊中唯一標識一個函數

我最初的問題是檢查一個函數內是否可調用模塊函數。我環顧四周,決定去找一個try(通話功能) - except(導入模塊)來簡化。我很樂意爲此搜索sys.mod,但我遇到了一些識別問題。

我現在的問題是,有從模塊導入函數的方法很多:import module將定義功能module.functionfrom module import function將其定義爲function。更不用說from module import function as myfunction。因此可以用幾種不同的方式調用相同的函數。

我的問題是:是否有一個獨特的「簽名」的功能,可以跟蹤如果模塊加載?具有實際的呼叫別名將會很棒。

除了PS:mod是數學函數和sys.mod回報加載的模塊列表,但是Python(2.7)當你的影子不會抱怨內置mod功能通過執行以下,from sys import mod。我覺得這有點尷尬 - 是否有任何方法可以通過編程方式避免這種陰影?

+0

請使用頂部的格式化按鈕,而不是制定自己的格式約定。 – Marcin

+3

「mod是數學函數」:在Python中,該mod拼寫爲'%'。 'mod'對Python沒有特殊的內在含義。因此,從某個模塊導入該名稱沒有問題。另外,沒有'sys.mod'(儘管有'sys.modules')。 – kindall

+0

我很好奇你爲什麼需要檢查模塊函數是否可調用。這可能不是你最初的問題。 – Keith

回答

3

我最初的問題是檢查一個函數內是否可以調用模塊函數。

根據定義,所有函數都是可調用的。這將測試一個對象是否可以被調用:http://docs.python.org/library/functions.html#callable

因此,可以用幾種不同的方式調用同一個函數。

是的,但它會是同一個對象。您可以使用f is g來測試fg是否是相同的對象。

更新:爲什麼你需要使用唯一的ID?嚴重的是,不要這樣做。您有用於身份測試的is,以及用於定義散列函數的__hash__方法。

如果有實際的呼叫別名,這將是太棒了。

根本不確定你的意思,但我認爲你只是希望它永遠是一個對象。它已經是。

mod是數學函數,sys.mod返回已加載模塊的列表,但python(2.7)不會從sys導入mod中投訴。我覺得這有點尷尬?

然後不要這樣做。你知道import ... as語法。在全局命名空間中也不默認mod(運營商%是爲此)。

最後,蟒蛇不抱怨你的導入行:

>>> from sys import mod 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ImportError: cannot import name mod 

(感謝kindall指出這一點)。

0
# define modulus f 
def mod(a,b): 
    return b % a 

print mod(5,2) 

別名:

modulus=mod 
print modulus(5,2) 

這是相當Python的結構,它是數學家

進口不同的方式非常直觀的服務,幫助您將功能分成不同的「名字空間」以便稍後在您的程序中使用,有時您希望使用很多功能,以便選擇較短的變體。

你也可以這樣做:

myat=math.atanh 

使別名在另一個 「名字空間」

,並用它作爲:

myat(x) 

,因爲它會使用math.atanh(x) - 變寫得較短

典型的程序員方法將被定義所有你想使用,然後使用它。我所相信的是,當你需要一個函數時,它會「懶惰」=>導入模塊。這就是爲什麼你想知道函數是否「可調用」的原因。

Python不是函數式編程語言(例如haskel),因此您可以加載或引用「按需」。

希望這有助於。

+1

實際上,可以在python中懶洋洋地加載東西。這是OP詢問的問題,這遠不清楚。 – Marcin

+0

如果你想解釋「懶惰」的技巧,我相信這對他有幫助。我用python不太好。 – ljgww

1

假設我有一個模塊如下:

def foo(): pass 
bar = foo 

你可以很容易地看到,它們是相同的功能,通過使用isid()

>>> import demo 
>>> from demo import * 
>>> demo.foo is foo 
True 
>>> id(demo.foo) == id(foo) 
True 
>>> demo.bar is foo 
True 

它們都指向同一個代碼對象,它只是在範圍字典中以不同名稱存儲。