2017-03-06 41 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() –

相关问题