【问题标题】:How to invoke a Python method using its fully qualified name?如何使用完全限定名称调用 Python 方法?
【发布时间】:2018-02-08 02:19:59
【问题描述】:

在 Java 中,我可以通过引用其完全限定名来调用类或方法而无需导入它:

public class Example {
    void example() {

        //Use BigDecimal without importing it
        new java.math.BigDecimal(1);
    }
}

类似的语法显然不适用于 Python:

class Example:
    def example(self):

        # Fails
        print(os.getcwd())

抛开良好做法和 PEP 建议,我可以在 Python 中做同样的事情吗?

【问题讨论】:

  • 不,你不能在不导入的情况下调用一个类或方法——你为什么要避免导入?您可以在您的函数中本地导入它,这只是将您的 java 1-liner 更改为 python 中的 2-liner。这是您唯一要避免的事情吗?
  • 我喜欢单行代码,因为我正在玩一些基于 AST 的代码注入,我想尽可能少地修改原始模块

标签: python methods module invoke


【解决方案1】:

我不确定您是否可以完全一样,但您只能导入函数:

from foo.bar import baz as baz_fn

baz_fn()

其中foo.bar 是包含函数的模块的完全限定名称,baz 是您要导入的函数的名称。它会将其导入为名称baz_fn

【讨论】:

    【解决方案2】:

    没有。如果要在 Python 中使用模块,则必须将其名称显式导入范围。而且,正如@AlexHall 所提到的,类/函数/模块不存在直到导入时间。没有import-ing 就无法访问它。然而,在我看来,这会产生更好、更明确的代码。这迫使您在导入模块名称时要明确。

    【讨论】:

      【解决方案3】:

      函数在其定义运行之前不存在,这意味着它所在的模块正在运行,这意味着模块已导入(除非它是您直接运行的脚本)。

      我能想到的最接近的是print(__import__('os').getcwd())

      【讨论】:

      • 看起来__import()__ 在这种情况下可以完美运行
      • @noamt 实际上,你真的不应该使用__import__。如果你想要类似的东西,请使用importlib.import_module
      • __import__importlib 是否处理带有类名的完全限定路径?例如module.OuterClass.InnerClass.some_classmethod?
      • @mgilson 看起来像,是的 https://stackoverflow.com/questions/8790003/dynamically-import-a-method-in-a-file-from-a-string
      • @noamt -- 根据我在那里看到的答案,看起来答案是“否”,它不能处理这种情况。答案都对字符串进行了一些处理,将其拆分为路径部分和fromlist 部分。
      猜你喜欢
      • 2012-10-12
      • 1970-01-01
      • 1970-01-01
      • 2013-06-21
      • 2012-11-21
      • 1970-01-01
      • 1970-01-01
      • 2016-09-30
      • 2018-08-11
      相关资源
      最近更新 更多