在Python中,在调用函数之前强制使用模块名

在Python中,在调用函数之前强制使用模块名,python,python-3.x,module,Python,Python 3.x,Module,我正在创建一个模块,我将在主脚本中导入该模块。在名为“colors”的模块中,有一个函数:“info()” 颜色模块: def info(function=None): print("\ncolors\n Info\n") 我的问题是,我还可能在主脚本中创建一个名为“info()”的函数。这不会有问题,只要我将颜色模块导入为: import colors from colors import * 如果是这样,我将通过以下方式调用模块中的函数: colors.info(

我正在创建一个模块,我将在主脚本中导入该模块。在名为“colors”的模块中,有一个函数:“info()”

颜色模块:

def info(function=None):
    print("\ncolors\n        Info\n")
我的问题是,我还可能在主脚本中创建一个名为“info()”的函数。这不会有问题,只要我将颜色模块导入为:

import colors
from colors import *
如果是这样,我将通过以下方式调用模块中的函数:

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


感谢所有帮助

从模块导入
*
时,您将不会有两个同名函数,您将有一个名为
info
的函数。使用这两种颜色中的哪一种(一种在
颜色中,或者一种在主脚本中)取决于相对于
从颜色导入*
语句,main中
info
的定义在哪里

您不能以任何方式“强制”模块前缀;如果没有使用
导入颜色导入
颜色
,则不会将该名称绑定到您可以引用的内容

如果您试图避免键入长名称,只需使用
from import
语句中的
as
子句重命名从
colors
引入的
info
函数即可:

from colors import info as c_info

这是不鼓励使用星型
*
导入的主要原因之一,也是为什么名称空间是一个好主意。使用
*
可以扔掉单独的名称空间(模块
colors
),该名称空间包含函数名
info
并将其放置在主脚本的名称空间中,从而屏蔽具有相同名称的对象。

不,不能强制调用函数。如果有人正在编写代码来调用您的函数,那么就要由他们来确保他们实际上能够调用它

要么:

import colors
或:

如果他们想叫它的话,它会起作用的。否则,他们只需避免创建名称冲突的函数

顺便说一句,一般情况下,不要使用颜色导入中的
*
,因为这意味着您不知道导入的是什么函数。例如:

from colors import *
from foobar import *

现在,是
info()
来自
colors
还是
foobar
?你不能确定,在接下来的某个时候,答案可能会改变。因此,请始终显式导入所需的名称,这样至少它们会列在使用它们的模块中,以便您可以看到何时会出现冲突。

您可以将颜色设置为类。信息的功能是颜色类的方法


因此,您只需即时更改颜色并调用info()方法

在导入中使用通配符被认为是一种反模式的做法,这将是一个坏主意。我只能想象所有的问题都滚到了“为什么我不能调用函数
info()
,尽管我在脚本中明确声明了它?”。如果有人导入*(无论如何)并定义他们自己的
info
函数,如果这被忽略,作为导入另一个模块的副作用,那将是绝对可怕的。我会做
导入颜色为co
,所以你有
info()
co.info()
:不会太长了,从长远来看,它可以省去麻烦。只需按名称导入的函数,
buc#
全局函数最好作为一个数组:
从颜色导入buc、redc、greenc、bluec
,然后您就可以执行
buc[0]
buc[1]
一直到
buc[255]
同样作为一个数组,您在
颜色模块中的键入更少:
buc=[(n,n,n)表示范围内的n(256)]
我主要希望从模块中导入变量,仅作为*。如果可能的话,我将使用一个类和两个import语句:“import colors”和“from colors import class”。有关更多信息,请参见问题编辑。谢谢。在我使用的PyCharm中,我总是被告知函数的来源。我也在更新我的问题,告诉我为什么要使用“从颜色导入*”。谢谢您的回答。@Andreas,在您编写代码时,没有PyCharm会告诉您
info()
来自哪里。但它不会告诉您,当有人编辑
foobar
时,导入是否会更改,并且您不会再次靠近原始模块。这就是为什么它是一种危险,不是在你写代码的时候,而是在你认为这段代码已经完成并清理干净之后,事情发生了很大的变化。谢谢。我之所以希望以这种方式导入模块,是因为其中包含全局变量。也许我可以将它们添加到一个类中。将我拥有的全局颜色变量添加到一个类中,将该类中的所有内容作为*导入,并将函数作为普通函数,例如“colors.info()”?像colors co.info()一样使用它