我正在阅读https://stackoverflow.com/a/28231805/156458
为什么我们可以将模块名称作为变量赋予builtins.__import__
函数,
虽然我们必须直接将模块名称赋予import
语句?
声明和导致这种差异的函数之间有什么区别?
答案 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()
允许您动态构建类,可以在不使用def
或lambda
的情况下构造函数,并且可以基于变量导入模块。当您有明确的动态行为用例而不是静态(但更易读)语法时,可以使用这些工具。