(Python)導出指定文件夾中as文件的徹底限定類名

AS3程序在編譯的過程當中,有一個特色是這樣的,無論是項目中的類,仍是標準庫或者第三方庫的類,編譯的時候只會把用到的那些類文件編譯進去,也就是說,某一些類,只要沒有被主程序引用到,那這個文件是不會被編譯進來的。實際的表現是,在程序運行的過程當中,getDefinitionByName是不能獲取到沒有引用的類,由於這個類根本就不在主程序運行的域裏面。c++

這也就帶來一個問題,在一些應用場合下,我須要用到某個類,但用到他倒是經過反射機制來獲取的(經過getDefinitionByName去獲取)。舉例來講,我有一個文件夾,是用來放主程序要用到的數據文件(數據是用AS3來描述的),但實際用的過程當中,都是經過動態獲取,若是數據類比較少,幾個幾十個這樣,那問題不大,一旦數據類很是多,上百上千個就很是麻煩了;還有的狀況是,數據類是經過其餘程序按照必定的規則來生成的,因此每次類的名稱都是不一樣的,而主程序獲取數據也是經過必定的規則獲取。這種的狀況下,我但願有一個程序來完成這樣的事情,在編譯以前,把指定文件夾下面的全部AS3類文件的信息,解析到一個指定的文本文件裏面。要讓一個類保證編譯進去,很是簡單,只要在主程序中保證使用用到就行,簡單的聲明一下就好,這也是下面這個Python程序乾的事情。工具

多說兩句,Python是我目前用過的語言裏面,我最喜歡的,簡潔、優雅、易懂,寫Python代碼就和寫僞代碼同樣,每一行代碼都能很清晰的把你的目的表達清楚,因此它還有另一個名字:「可執行的僞代碼」。在學習的過程當中,也瞭解到了另一個有意思的詞:Pythonic,這個詞的意思,簡單點說,就是用Python的風格寫Python。怎麼說呢,我記得以前我看過一篇文章,說有一些人在學習新的語言的時候,不能擺脫掉舊語言的一些桎梏,老是試圖用舊有的思惟去使用新的工具,新鞋走老路、新瓶裝舊酒,這樣寫出來的代碼,運行起來沒有問題,但對於一個熟悉這門語言的老鳥來講,這種代碼怎麼看怎麼彆扭,古怪並且累贅,難以理解,並且因爲前期測試程度有限,這些代碼被保留了下來,潛伏在陰暗的角落中,成爲整個項目的毒瘤。學習

畢竟,程序是給人看的,只是湊巧機器能夠運行而已。測試

Pythonic這個詞,也能夠推廣到其餘語言中,好比C++的《Effective c++》,不一樣的語言都有不一樣的設計思想,這也決定了在寫代碼的時候,會有一些約定俗成的規則。Python提供了優美的語法,強大的標準庫以及豐富的第三方擴展,在寫以前,最少應該瀏覽一遍《Python Manuals》,如下的程序的做用如上所述,是一個很是簡單的腳本,我在寫的時候,已經儘可能保證作到Pythonic,一方面是爲了瞭解更多的特性,另外一方面我有個同事要噴我。ui

這個程序,我最開始用Java寫過,用了173行(固然這和我不瞭解Java有關),簡直是慘不忍睹,用Python完成僅僅使用了39行代碼,我學習Python的語法加上閱讀官方文檔不過2天時間而已,也談不上多瞭解,從這點來看,學習成本很是低。spa

Python代碼:設計

import os

def list_file(dir_name, ext):
    result = []
    for root, dirs, files in os.walk(dir_name):
        result.extend(os.path.join(root, file_name) for file_name in files if file_name.endswith(ext))
    return result

def list_class(root, root_sep, ext):
    return (format_name(root_sep, file_name, ext) for file_name in list_file(root, ext))

def format_name(root_sep, file_name, ext):
    file_name = file_name.replace(ext, "").replace(root_sep, "").replace("\\", ".")
    return "import %s; %s;" % (file_name, file_name)

def export_file(root_list, ext, out_file):
    with open(out_file, "w") as f:
        for root in root_list:
            f.writelines(class_name + "\n" for class_name in list_class(root, root + "\\", ext))

def main():
    root_list = ["D:\\My Documents\\Flash Builder 4.5\\game\\src", "D:\\My Documents\\Flash Builder 4.5\\Easily\\src"]
    ext = ".as"
    out_file = "import.as"
    export_file(root_list, ext, out_file)

if __name__ == "__main__":
    main()

導出文件:code

import org.easily.utils.IDUtils; org.easily.utils.IDUtils;
import org.easily.utils.MathUtils; org.easily.utils.MathUtils;
import org.easily.utils.NumberUtils; org.easily.utils.NumberUtils;
import org.easily.utils.ObjectCache; org.easily.utils.ObjectCache;
import org.easily.utils.Offsets; org.easily.utils.Offsets;
import org.easily.utils.ShapeUtils; org.easily.utils.ShapeUtils;
import org.easily.utils.Singleton; org.easily.utils.Singleton;
import org.easily.utils.StringUtils; org.easily.utils.StringUtils;
import org.easily.utils.TimeUtil; org.easily.utils.TimeUtil;
import org.easily.utils.WebUtils; org.easily.utils.WebUtils;
import org.easily.utils.XMLUtil; org.easily.utils.XMLUtil;
相關文章
相關標籤/搜索