zoukankan      html  css  js  c++  java
  • (Python)导出指定文件夹中as文件的完全限定类名

    AS3程序在编译的过程中,有一个特点是这样的,不管是项目中的类,还是标准库或者第三方库的类,编译的时候只会把用到的那些类文件编译进去,也就是说,某一些类,只要没有被主程序引用到,那这个文件是不会被编译进来的。实际的表现是,在程序运行的过程中,getDefinitionByName是不能获取到没有引用的类,因为这个类根本就不在主程序运行的域里面。

    这也就带来一个问题,在一些应用场合下,我需要用到某个类,但用到他却是通过反射机制来获取的(通过getDefinitionByName去获取)。举例来说,我有一个文件夹,是用来放主程序要用到的数据文件(数据是用AS3来描述的),但实际用的过程中,都是通过动态获取,如果数据类比较少,几个几十个这样,那问题不大,一旦数据类非常多,上百上千个就非常麻烦了;还有的情况是,数据类是通过其他程序按照一定的规则来生成的,所以每次类的名称都是不同的,而主程序获取数据也是通过一定的规则获取。这种的情况下,我希望有一个程序来完成这样的事情,在编译之前,把指定文件夹下面的所有AS3类文件的信息,解析到一个指定的文本文件里面。要让一个类保证编译进去,非常简单,只要在主程序中保证使用用到就行,简单的声明一下就好,这也是下面这个Python程序干的事情。

    多说两句,Python是我目前用过的语言里面,我最喜欢的,简洁、优雅、易懂,写Python代码就和写伪代码一样,每一行代码都能很清晰的把你的目的表达清楚,所以它还有另外一个名字:“可执行的伪代码”。在学习的过程中,也了解到了另外一个有意思的词:Pythonic,这个词的意思,简单点说,就是用Python的风格写Python。怎么说呢,我记得之前我看过一篇文章,说有一些人在学习新的语言的时候,不能摆脱掉旧语言的一些桎梏,总是试图用旧有的思维去使用新的工具,新鞋走老路、新瓶装旧酒,这样写出来的代码,运行起来没有问题,但对于一个熟悉这门语言的老鸟来说,这种代码怎么看怎么别扭,古怪而且累赘,难以理解,而且由于前期测试程度有限,这些代码被保留了下来,潜伏在阴暗的角落中,成为整个项目的毒瘤。

    毕竟,程序是给人看的,只是凑巧机器可以运行而已。

    Pythonic这个词,也可以推广到其他语言中,比如C++的《Effective c++》,不同的语言都有不同的设计思想,这也决定了在写代码的时候,会有一些约定俗成的规则。Python提供了优美的语法,强大的标准库以及丰富的第三方扩展,在写之前,最少应该浏览一遍《Python Manuals》,以下的程序的作用如上所述,是一个非常简单的脚本,我在写的时候,已经尽量保证做到Pythonic,一方面是为了了解更多的特性,另一方面我有个同事要喷我。

    这个程序,我最开始用Java写过,用了173行(当然这和我不了解Java有关),简直是惨不忍睹,用Python完成仅仅使用了39行代码,我学习Python的语法加上阅读官方文档不过2天时间而已,也谈不上多了解,从这点来看,学习成本非常低。

    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 + "
    " 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()

    导出文件:

    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;
  • 相关阅读:
    HDMI速率计算
    HDMI各版本对比
    HDMI
    MOS管驱动详解
    Allegro16.6和17.0和17.2中将板框导出DXF文件
    allegro设置鼠标滚轮放大缩小
    MOS简介
    Allegro设置十字大光标
    笔记09
    笔记09 WS,WCF
  • 原文地址:https://www.cnblogs.com/yili16438/p/3382570.html
Copyright © 2011-2022 走看看