簡體   English   中英

是否可以從 Python 中的另一個文件執行縮進行?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM