在python程序中,如果我们有一个本地定义的函数,另一个我们从其他模块导入。哪一个会运行?
from example.maths import multiply
def multiply(a,b):
-----
multiply(2,3)
另外,如果我想在cython中编写一个函数并导入它。同时,如果用户没有安装cython,请保留本地定义的功能。如何实现这一目标?
答案 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()