Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何实现在另一个函数的中间重写函数调用?_Python_Import_Python Import - Fatal编程技术网

Python 如何实现在另一个函数的中间重写函数调用?

Python 如何实现在另一个函数的中间重写函数调用?,python,import,python-import,Python,Import,Python Import,我正在编写一个Python3程序,在这个程序中,我需要能够动态重写某些方法。我的文件夹结构更像: ./ prog.py methods/ add.py minus.py 在prog.py中,我想调用calc()函数,该函数在add.py和减号.py中都有定义。我希望《守则》能发挥以下作用: def prog('foo'): from method.foo import calc calc() 但是在函数中间导入似乎很糟糕,可能会减慢整个程序的速度。是否有任何变通方法可

我正在编写一个Python3程序,在这个程序中,我需要能够动态重写某些方法。我的文件夹结构更像:

./
prog.py
methods/
  add.py
  minus.py
prog.py
中,我想调用
calc()
函数,该函数在
add.py
减号.py
中都有定义。我希望《守则》能发挥以下作用:

def prog('foo'):
    from method.foo import calc
    calc()

但是在函数中间导入似乎很糟糕,可能会减慢整个程序的速度。是否有任何变通方法可以达到相同的效果

我尽量灵活,以便以后可以添加更多方法,因此我避免使用if语句,并一次导入所有模块。

您有两个选项:

  • 导入模块,并将模块名称与
    calc
    属性一起使用
  • 从以下位置导入替换名称下的
    calc
    函数:。。。导入。。。作为
无论哪种方式,我都会将函数引用存储在字典中,而不是使用
if。。elif
选择一个

第一种方法

from method import add
from method import minus

calc_functions = {
    'add': add.calc,
    'minus': minus.calc,
}

def prog(method):
    return calc_functions[method]()   
或者第二个:

from method.add import calc as addition
from method.minus import calc as subtraction

calc_functions = {
    'add': addition,
    'minus': subtraction,
}

def prog(method):
    return calc_functions[method]()   
如果需要动态导入模块,则使用,无需担心名称冲突:

import importlib

def prog(method):
    try:
        calc_module = importlib.import_module('method.' + method)
    except ModuleNotFoundError:   # or ImportError in Python < 3.6
        raise ValueError('No such method {!r}'.format(method))
    return calc_module.calc()

    return calc_functions[method]()   
导入导入库
def程序(方法):
尝试:
计算模块=importlib.import模块('method.'+method)
除ModuleNotFoundError:#或Python<3.6中的ImportError之外
raise VALUERROR('没有这样的方法{!r}'。格式(方法))
返回计算模块.calc()
返回计算函数[方法]()
您有两个选项:

  • 导入模块,并将模块名称与
    calc
    属性一起使用
  • 从以下位置导入替换名称下的
    calc
    函数:。。。导入。。。作为
无论哪种方式,我都会将函数引用存储在字典中,而不是使用
if。。elif
选择一个

第一种方法

from method import add
from method import minus

calc_functions = {
    'add': add.calc,
    'minus': minus.calc,
}

def prog(method):
    return calc_functions[method]()   
或者第二个:

from method.add import calc as addition
from method.minus import calc as subtraction

calc_functions = {
    'add': addition,
    'minus': subtraction,
}

def prog(method):
    return calc_functions[method]()   
如果需要动态导入模块,则使用,无需担心名称冲突:

import importlib

def prog(method):
    try:
        calc_module = importlib.import_module('method.' + method)
    except ModuleNotFoundError:   # or ImportError in Python < 3.6
        raise ValueError('No such method {!r}'.format(method))
    return calc_module.calc()

    return calc_functions[method]()   
导入导入库
def程序(方法):
尝试:
计算模块=importlib.import模块('method.'+method)
除ModuleNotFoundError:#或Python<3.6中的ImportError之外
raise VALUERROR('没有这样的方法{!r}'。格式(方法))
返回计算模块.calc()
返回计算函数[方法]()

是否有什么东西阻止您只调用if语句分支中的函数,或者是比示例显示的更复杂的东西?没有,但我正在考虑不时添加不同的calc()。实际上,我希望实现prog(add)导入method.add而不使用if语句。我将修改我的问题@BHustusOhh,那么您希望能够从某个路径动态加载模块吗?如果您希望动态导入某些内容,有一些方法可以在运行时这样做。我不打算将此作为正式答案发布,因为我还没有测试过这一点,我不建议从字面上理解我的话,但请仔细研究并明智地使用
del
,看看这是否符合您的需要。这是正确的。。。不引起麻烦。@bhusis是否有什么东西阻止您只调用if语句分支中的函数,或者是比示例显示的更复杂的东西?没有,但我正在考虑不时添加不同的calc()。实际上,我希望实现prog(add)导入method.add而不使用if语句。我将修改我的问题@BHustusOhh,那么您希望能够从某个路径动态加载模块吗?如果您希望动态导入某些内容,有一些方法可以在运行时这样做。我不打算将此作为正式答案发布,因为我还没有测试过这一点,我不建议从字面上理解我的话,但请仔细研究并明智地使用
del
,看看这是否符合您的需要。这是正确的。。。不会引起麻烦。:@bhusthis这很好,但在我的情况下,每次添加一些新的calc()方法时,我都需要更改代码。可以动态导入吗?@7O:clock:是的,你可以动态导入模块,看这很好,但是在我的例子中,每次添加新的calc()方法时,我都需要更改代码。可以动态导入吗?@7:00:可以,您可以动态导入模块,请参阅