[英]Is it possible to execute indented lines from another file in Python?
說,我有兩個文件demo.py
# demo.py
from pathlib import Path
for i in range(5):
exec(Path('another_file.txt').read_text())
和another_file.txt
(注意縮進)
print(i)
是否可以讓python demo.py
運行?
NB 這在使用 Page(或 wxformbuilder 或 pyqt 的設計器)生成 GUI 布局時非常有用,其中回調函數的骨架會自動生成。 必須修改骨架,同時,每次迭代都會覆蓋骨架——代碼片段必須被復制回來。 無論如何,如果您使用過任何 Page 或 wxformbuilder 或 pyqt 的設計器,您就會知道我在說什么。
您可以通過刪除縮進來解決基本問題:
from pathlib import Path
import textwrap
for i in range(5):
exec(textwrap.dedent(Path('another_file.txt').read_text()))
這仍然存在兩個相當大的問題:
這里有嚴重的安全隱患。 您正在運行代碼而不將其包含在您的項目中。 您可以“稍后再擔心安全性和其他問題”的想法會在以后給您帶來痛苦。 您將在此站點上看到類似的建議,避免 SQL 注入。 以后的日期可能永遠不會到來,即使確實到來了,您也很有可能不會記住或正確識別所有問題。 最好一開始就避免這些問題。
此外,使用這樣的動態代碼,您會冒着遇到語法錯誤的風險,調用堆棧不會向您顯示代碼的來源。 對於像這樣的簡單案例來說這還不錯,但是隨着您為這樣的項目添加越來越多的復雜性,您可能會發現您正在添加更多支持來幫助您調試遇到的問題,而不是花時間添加功能.
而且,將這兩個問題結合起來會很有趣。 這是人為的,但是如果您將for
循環更改為while
循環,如下所示:
i = 0
while i < 5:
exec(textwrap.dedent(Path('another_file.txt').read_text()))
i += 1
然后將文本文件修改為:
print(i)
i += 1
理解為什么它不再像您預期的那樣運行 5 次是微不足道的,但是隨着這個項目的兩個“方面”變得更加復雜,弄清楚元素之間復雜的相互作用將變得更加困難。
簡而言之,不要使用eval
。 未來你會感謝過去的你,讓你的生活更輕松。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.