首先亮相,在我看來,有兩件事情可以做...
- 繼續追求使用Python源文件作爲配置文件。 (我不推薦這樣做。這是類似於使用推土機撞擊釘子或轉換a shotgun到車輪)
切換到類似TOML,JSON或YAML的配置文件,這是專爲工作。
JSON或YAML中的任何內容都不能阻止它們保持「有序」鍵值對。 Python的dict
數據類型默認是無序的(至少到3.5),並且list
數據類型是有序的。當使用默認加載器時,它們分別直接映射到JSON中的對象和數組。在對它們進行反序列化時,只需使用Python的OrderedDict
之類的東西,就可以維持秩序!
有了這樣的方式,如果你真的想使用Python源文件的配置,我建議嘗試處理使用ast
模塊文件。抽象語法樹是語法級別分析的強大工具。
我鞭打了一個快速腳本,用於從文件中提取類行號和名稱。
你(或任何真正的人)可以使用它,或者擴展它以獲得更廣泛的檢查權限,並且可以隨時隨地進行更多檢查。
import sys
import ast
import json
class ClassNodeVisitor(ast.NodeVisitor):
def __init__(self):
super(ClassNodeVisitor, self).__init__()
self.class_defs = []
def visit(self, node):
super(ClassNodeVisitor, self).visit(node)
return self.class_defs
def visit_ClassDef(self, node):
self.class_defs.append(node)
def read_file(fpath):
with open(fpath) as f:
return f.read()
def get_classes_from_text(text):
try:
tree = ast.parse(text)
except Exception as e:
raise e
class_extractor = ClassNodeVisitor()
li = []
for definition in class_extractor.visit(tree):
li.append([definition.lineno, definition.name])
return li
def main():
fpath = "/tmp/input_file.py"
try:
text = read_file(fpath)
except Exception as e:
print("Could not load file due to " + repr(e))
return 1
print(json.dumps(get_classes_from_text(text), indent=4))
if __name__ == '__main__':
sys.exit(main())
這裏有以下文件運行示例:
input_file.py
:
class Foo:
pass
class Bar:
pass
輸出:
$ py_to_json.py input_file.py
[
[
1,
"Foo"
],
[
5,
"Bar"
]
]
如果我輸入example
,
如果你要導入模塊,該模塊example
要導入的路徑上。導入意味着在example
模塊中執行任意 Python代碼。這是一個非常大的安全漏洞 - 您要在與應用程序其餘部分相同的上下文中加載用戶可編輯的文件。
這是一個很模糊的想法。你應該給[Figura](https://figura.readthedocs.io/en/latest/)一槍! – shx2
我應該指出在Figura中不保存聲明的順序,[也不在json中](http://stackoverflow.com/a/7214312),也不在YAML中。 – shx2
@ shx2 AFAIK yaml中的訂單得到保存。否則,在saltstack中訂購狀態將無法運行:https://docs.saltstack.com/en/latest/ref/states/ordering。html – guettli