gpt4 book ai didi

python - 从不同的文件调用一个函数,其中文件名和函数名是从列表中读取的

转载 作者:太空宇宙 更新时间:2023-11-04 11:09:59 27 4
gpt4 key购买 nike

我有多个函数存储在不同的文件中,文件名和函数名都存储在列表中。是否有任何选项可以在没有条件语句的情况下调用所需的函数?例如,file1 具有函数 function11function12

def function11():
pass
def function12():
pass

file2 有函数 function21function22

def function21():
pass
def function22():
pass

我有 list

file_name = ["file1", "file2", "file1"]
function_name = ["function12", "function22", "funciton12"]

我将从不同的函数中获取列表索引,基于此我需要调用该函数并获取输出。

最佳答案

如果其他函数会直接给你一个列表索引,那么你不需要将函数名作为字符串来处理。相反,直接存储(不调用)列表中的函数:

import file1, file2

functions = [file1.function12, file2.function22, file1.function12]

然后在你有索引后调用它们:

function[index]()

种方法可以在 Python 中执行所谓的“反射”,并从字符串获取匹配命名的函数。但是他们解决的问题比您描述的更高级,而且更困难(特别是如果您还必须使用模块名称)。


如果你有一个允许从配置文件调用的函数和模块的“白名单”,但仍然需要通过字符串找到它们,你可以使用字典显式创建映射:

allowed_functions = {
'file1': {
'function11': file1.function11,
'function12': file1.function12
},
'file2': {
'function21': file2.function21,
'function22': file2.function22
}
}

然后调用函数:

try:
func = allowed_functions[module_name][function_name]
except KeyError:
raise ValueError("this function/module name is not allowed")
else:
func()

最高级的方法是,如果您需要从作者创建的“插件”模块加载代码。您可以使用标准库importlib 包来使用字符串名称找到一个文件作为模块导入,并动态导入它。它看起来像:

from importlib.util import spec_from_file_location, module_from_spec

# Look for the file at the specified path, figure out the module name
# from the base file name, import it and make a module object.
def load_module(path):
folder, filename = os.path.split(path)
basename, extension = os.path.splitext(filename)
spec = spec_from_file_location(basename, path)
module = module_from_spec(spec)
spec.loader.exec_module(module)
assert module.__name__ == basename
return module

仍然不安全,因为它可以在文件系统的任何地方查找模块。如果您自己指定文件夹更好,并且只允许在配置文件中使用文件名;但是你仍然必须通过在“文件名”中使用“..”和“/”之类的东西来防止黑客入侵路径。

(我有一个项目做这样的事情。它从也在用户控制下的白名单中选择路径,所以我必须警告我的用户不要相互信任路径白名单文件。我也在目录中搜索模块,然后仅根据目录中的插件创建可能使用的插件白名单 - 所以没有带有“..”的有趣游戏。而且我仍然担心我忘记了什么。)

一旦有了模块名称,就可以通过名称从中获取函数,例如:

dynamic_module = load_module(some_path)
try:
func = getattr(dynamic_module, function_name)
except AttributeError:
raise ValueError("function not in module")

无论如何,没有理由eval 任何东西,或者根据用户输入生成和导入代码。这是最不安全的。

关于python - 从不同的文件调用一个函数,其中文件名和函数名是从列表中读取的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58500061/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com