动态地从字符串中导入文件中的一个方法。

14 浏览
0 Comments

动态地从字符串中导入文件中的一个方法。

我有一个字符串,比如:`abc.def.ghi.jkl.myfile.mymethod`。我该如何动态导入`mymethod`?\n这是我处理的方法:\n

def get_method_from_file(full_path):
    if len(full_path) == 1:
        return map(__import__,[full_path[0]])[0]
    return getattr(get_method_from_file(full_path[:-1]),full_path[-1])
if __name__=='__main__':
    print get_method_from_file('abc.def.ghi.jkl.myfile.mymethod'.split('.'))

\n我想知道是否需要导入单独的模块。\n编辑:我使用的Python版本是2.6.5。

0
0 Comments

动态地从一个字符串中导入文件的方法是一个常见的编程需求。在Python中,有几种方式可以实现这个目标。在Python版本小于2.7的情况下,可以使用内置方法__import__来实现。代码如下:

__import__('abc.def.ghi.jkl.myfile.mymethod', fromlist=[''])

而在Python版本大于等于2.7或3.1的情况下,可以使用更方便的方法importlib.import_module来实现。代码如下:

importlib.import_module('abc.def.ghi.jkl.myfile.mymethod')

然而,根据评论的更新,上述解决方法都存在问题(我承认我没有完整地阅读要导入的字符串,我错过了导入一个方法而不是一个模块本身的事实)。根据不同的Python版本,我们需要进行一些修改:

在Python版本小于2.7的情况下,代码应该如下:

mymethod = getattr(__import__("abc.def.ghi.jkl.myfile", fromlist=["mymethod"]))

在Python版本大于等于2.7的情况下,代码应该如下:

mymethod = getattr(importlib.import_module("abc.def.ghi.jkl.myfile"), "mymethod")

然而,以上解决方法都存在问题,因为在__import__()和importlib.import_module()的第一个参数中必须是一个模块名,而不是一个字符串。因此,导入一个方法而不是一个模块的方法是行不通的。

总之,以上的解决方法都无法实现从一个字符串中动态导入文件的目标。因为导入方法需要指定导入的模块,而不是方法本身。

0
0 Comments

问题的出现原因是需要动态地从一个字符串中导入一个文件中的方法。在给定的代码片段中,提供了一个函数import_from(),它可以根据给定的模块和名称导入并返回相应的对象。这个函数可以通过传递模块名称和方法名称来实现从字符串中动态导入方法。

为了解决这个问题,可以使用import_from()函数来实现动态导入方法。函数的实现是通过使用__import__()函数来导入指定的模块,并使用getattr()函数来获取指定的方法。需要注意的是,__import__()函数接受一个fromlist参数,用于指定需要导入的名称列表。因此,在调用import_from()函数时,只需传递模块名称和方法名称即可实现动态导入。

在给定的示例中,通过调用import_from()函数并传递"abc.def.ghi.jkl.myfile"作为模块名称,"mymethod"作为方法名称,可以实现从字符串中动态导入方法。

需要注意的是,在Python中,模块级别的函数被称为函数而不是方法。

虽然__import__()方法可以实现动态导入,但Python官方推荐使用importlib模块的import_module()函数来实现动态导入。根据help(__import__)的提示,__import__()方法主要是为Python解释器使用而不是一般用途,因此更好地使用importlib模块来实现程序化地导入模块。

总结起来,解决这个问题的方法是使用import_from()函数来实现从字符串中动态导入方法。尽管__import__()方法可以实现这一目标,但是根据Python官方的建议,最好使用importlib模块的import_module()函数来实现动态导入。对于这个问题,使用importlib模块没有明显的优势,而且在Python 2.5和2.6广泛使用时,__import__()方法是有效的选择。但是,现在使用importlib模块是更好的选择。

以上就是关于从一个字符串中动态导入方法的问题的出现原因和解决方法的整理。

0
0 Comments

动态导入一个文件中的方法,可以使用Python 2.7中的importlib.import_module()函数。可以使用以下代码导入一个模块并访问其中定义的对象:

from importlib import import_module
p, m = name.rsplit('.', 1)
mod = import_module(p)
met = getattr(mod, m)
met()

值得注意的是,Python文档建议使用importlib.import_module()而不是__import__():docs.python.org/2/library/functions.html#__import__ -- 适用于2.7+ 版本。

import_module + rsplit = 真正的方法。

0