Python getattr调用platform模块报'module' object is not callable错
报错原因
你预设列表里的所有属性都是platform模块下可调用的函数,实际上列表里混入了多种非函数类型的属性,统一加()调用就会触发类型错误:
- 触发你看到的 'module' object is not callable 报错的直接原因,是列表里的
collections、os、re、sys、platform这几个项,对应的都是platform模块引用的其他依赖模块,模块对象本身不能被调用。 - 除此之外列表里还有其他非可调用属性,比如
uname_result是定义返回值结构的类、部分版本相关的常量属性,无脑加括号同样会触发其他类型的调用错误。
修复方案
获取属性后先判断对象是否可调用,可调用对象再加括号执行,不可调用的对象直接取值即可,修复后的代码如下:
import platform mm = ['architecture', 'collections', 'java_ver', 'libc_ver', 'mac_ver', 'machine', 'node', 'os', 'platform', 'processor', 'python_branch', 'python_build', 'python_compiler', 'python_implementation', 'python_revision', 'python_version', 'python_version_tuple', 're', 'release', 'sys', 'system', 'system_alias', 'uname', 'uname_result', 'version', 'win32_edition', 'win32_is_iot', 'win32_ver'] for i in mm: attr = getattr(platform, i) if callable(attr): c = attr() else: c = attr print(f"{i}: {c}")
运行后既可以得到architecture()、python_version()这类函数的执行结果,也能正常输出模块、常量类属性的实际值,不会再触发调用报错。
内容的提问来源于stack exchange,提问作者chumba mumbau
相关产品推荐
相关产品推荐

