2017-03-06 53 views
-1

我正在創建一個模塊,我將在主腳本中導入。在稱爲「顏色」的模塊中,有一個函數:「info()」。在調用函數之前強制使用模塊名稱,在Python中

顏色模塊:

def info(function=None): 
    print("\ncolors\n  Info\n") 

我的問題是,我還可以創建一個名爲「信息()」功能,在主腳本。這會不會是一個問題,只要我輸入的顏色模塊爲:

colors.info() 

如果我來代替:

import colors 

如果是的話,我會通過寫作調用模塊中的功能導入模塊爲:

from colors import * 

我有兩個函數叫做完全相同。

主要腳本:

from colors import * 
def info(): # A 
    print("Main script's function") 

info() # A 
colors.info() # Am I able to force use of the module name before calling the 
       # function, if I import the module as in this script? Can this 
       # be done from the module, and not from the main script? As said, 
       # force use of module name, as "colors.info()", shall only apply 
       # when the module is being imported with "from colors import *". 

編輯1

我爲什麼要導入模塊,這樣的原因,是因爲在它的全局變量:

bwc0 = (0, 0, 0) 
bwc1 = (1, 1, 1) 
bwc2 = (2, 2, 2) 
# All the way to 255 

後一些答案,我會嘗試將這些添加到類中,並儘可能將該類導入爲*。 我也有一些功能,我也想輸入爲*。我不確定如何導入它們。我想可能很簡單。

def redc(value): 
    return value, 0, 0 

def greenc(value): 
    return 0, value, value 

感謝所有幫助

+0

使用通配符在進口被認爲這將是一個反模式 –

+0

一個改變壞主意。我只能想象所有的問題在「爲什麼我無法調用函數info()',儘管我明確地**在腳本中聲明瞭它?」。如果有人導入*([這是壞的](http://stackoverflow.com/questions/2386714/why-is-import-bad),並定義他們自己的'info'函數,如果忽略這個函數將是非常可怕的作爲另一個被導入的模塊的副作用。 – kazemakase

+0

我會''將顏色導入爲co',所以你同時擁有'info()'和'co.info()':不再更長,並且從長遠來看可以節省頭痛。 – farsil

回答

2

不,你不能強制你的函數被調用。如果有人正在編寫代碼來調用您的函數,則由他們來確保他們實際上可以調用它。

或者:

import colors 

或者:

from colors import info as colors_info 

將工作,如果他們想叫它。否則,他們只能避免創建名稱衝突的函數。

順便說一句,作爲一般情況下不使用from colors import *,因爲它意味着你不知道你正在導入什麼函數。例如:

from colors import * 
from foobar import * 
現在

,是info()colorsfoobar來了嗎?你不能確定,在某個地方,答案可能會改變。因此,請始終以明確的方式導入您需要的名稱,至少它們在使用它們的模塊中列出,以便您可以看到何時發生衝突。

+0

在我使用的PyCharm中,我總是知道函數來自哪裏。我也在更新我的問題,告訴我爲什麼要使用「從顏色導入*」。謝謝你的回答。 – Andreas

+0

@Andreas,PyCharm在編寫代碼時會告訴你'info()'來自哪裏。但它不會告訴你,當有人編輯'foobar'時,如果進口改變,並且你不會再次接近原始模塊。這就是爲什麼這是一個危險,而不是當你編寫代碼時,而是當你認爲這段代碼完成並被丟棄之後事情發生很大變化時。 – Duncan

+0

Oki。謝謝,我明白了。 – Andreas

2

從模塊導入*當你不會有兩個名稱相同的功能,你就會有一個函數名稱info。使用哪一個(colors中的一個或主腳本中的一個)取決於main中info的定義相對於from colors import *語句的定義。

您無法以任何方式「強制」模塊前綴;如果您沒有用import colors導入colors,那麼您沒有將該名稱綁定到可以引用的內容。

如果鍵入長的名字是你想避免的事情,只是重命名info功能通過使用as子句from import語句從colors帶來:

from colors import info as c_info 

這是一使用明星*導入的主要原因是不鼓勵的,爲什麼命名空間是一個好主意。使用*可以丟棄名稱爲info函數的獨立名稱空間(模塊colors),並將其放置在主腳本的名稱空間中,從而掩蓋具有相同名稱的對象。

+0

謝謝。我想以這種方式導入模塊的原因是因爲其中包含全局變量。也許我可以將它們添加到課程中。 – Andreas

0

您可以使顏色像一個類。而信息的功能是顏色類的方法

如此,你只是瞬間的色彩和調用info()方法

+0

將我擁有的全局顏色變量添加到類中,將該類中的所有內容導入爲*,並具有正常的功能,如「colors.info()」? – Andreas

+0

使用它像 colors co co.info() –

相關問題