[英]Python's importlib and inspect for static class members
在長時間運行的應用程序中,我需要根據類模塊的路徑和類名動態修改靜態類成員。
前任。 我有一個類pack1.mod1.Person
並且根據定義我知道它有一個age
屬性。 因此,利用importlib
和inspect
我嘗試使用模塊路徑和類名加載類並更新age
屬性。 一切似乎都很好,直到我從我自然導入的Person
類中讀取了age
屬性並發現它沒有更新。
以下是更多詳細信息:
.
├── app.py
└── pack1
├── __init__.py
└── mod1.py
模塊1.py
class Person:
age = 42
應用程序
import inspect
import os
from importlib import util
from pack1.mod1 import Person
if __name__ == '__main__':
Person.age = 3
print(Person.age) # => 3
spec = util.spec_from_file_location('pack1.mod1', os.path.join('pack1', 'mod1.py'))
module = util.module_from_spec(spec)
spec.loader.exec_module(module)
members = inspect.getmembers(module)
for x, member in inspect.getmembers(module, lambda i: inspect.isclass(i) and i.__name__ == Person.__name__):
print('Person:', Person.age) # => Person: 3
print('Person from inspect:', member.age) # => Person from inspect: 42
Person.age = 11
member.age = 66
print('Person:', Person.age) # => Person: 11
print('Person from inspect:', member.age) # => Person from inspect: 66
在app.py
我希望member
和Person
是同一件事,但正如示例所示,它們不是。
我錯過了什么以及如何對類的靜態成員進行這樣的更新?
Python 無法知道定期導入的模塊和手動模塊是“相同的”:使用util.spec_from_file_location
到spec.loader.exec_module
Python 的模塊注冊表並顯式創建模塊的新實例。
相反,使用解釋器的本機操作( import
,...)或其編程等效項( importlib.load_module
,...)
如果模塊/類是眾所周知的,可以定期import
並直接檢查它。
import pack1.mod1
pack1.mod1.Person.age = 66
如果模塊和類僅通過名稱知道,則可以從現有模塊中查找它們。
import importlib
module_name, qualname, attribute, value = 'pack1.mod1', 'Person', 'age', 66
obj = importlib.import_module(module_name) # same as `import {module_name}`
for part in qualname.split('.'):
obj = getattr(obj, part) # same as `{obj}.{part}
setattr(obj, attribute, value) # same as `{obj}.{attribute} = {value}`
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.