如何使用其完全限定名称调用 Python 方法?
How to invoke a Python method using its fully qualified name?
在 Java 中,我可以通过引用其完全限定名称来调用 class 或方法而不导入它:
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 中做同样的事情吗?
我不确定你是否可以做完全相同的事情,但你可以只导入函数:
from foo.bar import baz as baz_fn
baz_fn()
其中 foo.bar
是包含该函数的模块的完全限定名称,baz
是您要导入的函数的名称。它将导入为名称 baz_fn
.
没有。如果你想在 Python 中使用一个模块,你必须显式地将它的名字导入到作用域中。而且,正如@AlexHall 提到的,class/function/module 不存在 直到 导入时间。没有 import
-ing 就无法访问它。然而,在我看来,这会产生更好、更明确的代码。这迫使您在导入模块名称时要明确。
一个函数在它的定义运行之前不存在,这意味着它所在的模块运行,这意味着该模块被导入(除非它是您直接 运行 的脚本)。
我能想到的最接近的是print(__import__('os').getcwd())
。
很晚了,但如果有人觉得它有用,我一直在使用:
def fqn_import(fqn: str):
module_name, _, function_name = fqn.rpartition('.')
return getattr(importlib.import_module(module_name), function_name)
在 Java 中,我可以通过引用其完全限定名称来调用 class 或方法而不导入它:
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 中做同样的事情吗?
我不确定你是否可以做完全相同的事情,但你可以只导入函数:
from foo.bar import baz as baz_fn
baz_fn()
其中 foo.bar
是包含该函数的模块的完全限定名称,baz
是您要导入的函数的名称。它将导入为名称 baz_fn
.
没有。如果你想在 Python 中使用一个模块,你必须显式地将它的名字导入到作用域中。而且,正如@AlexHall 提到的,class/function/module 不存在 直到 导入时间。没有 import
-ing 就无法访问它。然而,在我看来,这会产生更好、更明确的代码。这迫使您在导入模块名称时要明确。
一个函数在它的定义运行之前不存在,这意味着它所在的模块运行,这意味着该模块被导入(除非它是您直接 运行 的脚本)。
我能想到的最接近的是print(__import__('os').getcwd())
。
很晚了,但如果有人觉得它有用,我一直在使用:
def fqn_import(fqn: str):
module_name, _, function_name = fqn.rpartition('.')
return getattr(importlib.import_module(module_name), function_name)