为什么我们必须直接将模块名称赋给`import`语句?

时间:2017-06-23 13:23:44

标签: python python-3.x

我正在阅读https://stackoverflow.com/a/28231805/156458

为什么我们可以将模块名称作为变量赋予builtins.__import__函数, 虽然我们必须直接将模块名称赋予import语句?

声明和导致这种差异的函数之间有什么区别?

1 个答案:

答案 0 :(得分:8)

您需要将函数名称赋予def语句,或将类名称赋予class;两者都可以通过其他方式创建。因为这就是语法的设计方式,所以使用可读的清晰,简洁的语法来实现通用操作。

出于同样的原因,当您已经知道要访问的属性名称时使用object.attributename,但在需要动态确定名称时使用getattr()。后者更适合程序员理解。

想象一下必须跋涉

modules_to_import = ['builtins', 'datetime']
for name in modules_to_import:
    globals()[name] = __import__(name)
print_function_name = 'print'
current_time = getattr(getattr(globals()['datetime'], 'datetime'), 'now')()
getattr(globals()['builtins'], print_function_name).__call__('Hello world!, it is now', current_time)

那是完全不可读的。将其与

进行比较
import datetime
current_time = datetime.datetime.now()
print('Hello world!, it is now', current_time)

Python是highly dynamic programming language,但是,您可以获得动态执行许多任务的工具。 type()允许您动态构建类,可以在不使用deflambda的情况下构造函数,并且可以基于变量导入模块。当您有明确的动态行为用例而不是静态(但更易读)语法时,可以使用这些工具。