在python中,如果我们有一个与我们导入的函数同名的函数会发生什么。哪一个会运行?

时间:2017-03-19 09:01:53

标签: python function oop

在python程序中,如果我们有一个本地定义的函数,另一个我们从其他模块导入。哪一个会运行?

from example.maths import multiply

def multiply(a,b):
    -----

multiply(2,3)

另外,如果我想在cython中编写一个函数并导入它。同时,如果用户没有安装cython,请保留本地定义的功能。如何实现这一目标?

4 个答案:

答案 0 :(得分:0)

如果您有两个相同的名称,则保留运行时传递的较新名称。由于您不想覆盖导入的乘法,因此可以使用import...as语句并将其相乘一个不同的名称。此外,cython在导入时基本相同。

from example.maths import multiply as multi

def multiply(a,b):
    -----

multiply(2,3)
# multi(2,3)

答案 1 :(得分:0)

嗯,这不是一个好的编码实践。您永远不应该使用与导入函数相同的名称定义函数。

在您的情况下,您在本地定义的函数将优先于导入的函数。这样想:如果你有一些在__main__部分代码中定义的变量,然后在某个函数中对某个变量使用相同的名称,那么该变量将"覆盖"第一。导入也是如此。

答案 2 :(得分:0)

这取决于。 如果在定义新函数后调用multiply,则将调用本地定义的函数。如果您之前调用multiply,您将使用导入的函数。

Python 3中的一个简短示例:

import math
print(math)
# <module 'math' from '/usr/local/lib/python3.5/lib-dynload/math.cpython-35m-x86_64-linux-gnu.so'>

def math():
   pass

print(math)
# <function math at 0x7fe5a376db70>

答案 3 :(得分:0)

  

在python程序中,如果我们有一个本地定义的函数,另一个我们从其他模块导入。哪一个会运行?

你们将取代之前的那个,我相信任何IDE都会给你一个警告。

您可以使用内置函数globals在当前模块中调用所有可用的全局符号:

from math import floor

print(globals())

def floor(x):
    print 'hello, ' + x

print(globals())

第一个print(globals())将打印:

{'floor': <built-in function floor>, '__builtins__': <module '__builtin__' (built-in)>, '__file__': 'test.py', '__package__': None, '__name__': '__main__', '__doc__': None}

但第二个将打印出来:

{'floor': <function floor at 0x104649cf8>, '__builtins__': <module '__builtin__' (built-in)>, '__file__': 'test.py', '__package__': None, '__name__': '__main__', '__doc__': None}

您可以看到符号floor已被后者替换。

  

另外,如果我想在cython中编写一个函数并导入它。同时,如果用户没有安装cython,请保留本地定义的功能。如何实现这一目标?

您可以使用以下方式实现它:

try:
    from your_module import func_maybe_not_exist
except ImportError:
    def func_maybe_not_exist():
        print "local implementation"

if __name__ == '__main__':
    func_maybe_not_exist()