• 模块导入与编写规范


    from...import ...
    from...import...与import语句基本一致,唯一不同的是:使用import foo(模块名)导入模块后,引用模块中的名字都需要加上foo.(模块名点)作为前缀,
    而使用from foo import x,get,change,Foo(变量名或函数名)则可以在当前执行文件中直接引用模块foo中的名字。
    导入模块发生的三件事情:
    1、产一个模块的名称空间
    2、运行foo.py将运行过程中产生的名字都丢到模块的名称空间去
    3、在当前名称空间拿到一个名字,该名字与模块名称空间中的某一个内存地址
    from foo import x x指向的就是foo中x映射关系的那个值的内存地址

    impot导入模块在使用时必须加前缀"模块."
    优点:肯定不会与当前名称空间中的名字冲突
    缺点:加前缀显得麻烦

    from...impot...导入模块在使用时不用加前缀
    优点:代码更精简
    缺点:容易与当前名称空间混淆


    from foo import * (导入模块中所有的名字)
    *代表导入模块foo的所有公有属性、方法、类
    如果指定了__all__则导入*的时候只能用all里面的变量、方法、类

    from foo import get as g(也可以用as起别名)
    通常在被导入的名字过长时采用起别名的方式来精简代码,另外为被导入的名字起别名可以很好地避免与当前名字发生冲突,
    还有很重要的一点就是:可以保持调用方式的一致性,例如我们有两个模块json和pickle同时实现了load方法,
    作用是从一个打开的文件中解析出结构化的数据,但解析的格式不同,可以用下述代码有选择性地加载不同的模块

    if data_format == 'json':
    import json as serialize #如果数据格式是json,那么导入json模块并命名为serialize
    elif data_format == 'pickle':
    import pickle as serialize #如果数据格式是pickle,那么导入pickle模块并命名为serialize

    data=serialize.load(fn) #最终调用的方式是一致的

    循环导入问题

    循环导入问题指的是在一个模块加载/导入的过程中导入另外一个模块,而在另外一个模块中又返回来导入第一个模块中的名字,
    由于第一个模块尚未加载完毕,所以引用失败、抛出异常,究其根源就是在python中,同一个模块只会在第一次导入时执行其内部代码,
    再次导入该模块时,即便是该模块尚未完全加载完毕也不会去重复执行内部代码

    解决方案:方案一:导入语句放到最后,保证在导入时,所有名字都已经加载过
    方案二:导入语句放到函数中,只有在调用函数时才会执行其内部代码

    注意:循环导入问题大多数情况是因为程序设计失误导致,上述解决方案也只是在烂设计之上的无奈之举,
    在我们的程序中应该尽量避免出现循环/嵌套导入,如果多个模块确实都需要共享某些数据,可以将共享的数据集中存放到某一个地方,
    然后进行导入,不要进行屎上雕花的操作

    搜索模块的路径与优先级
    1):内置模块
    2):sys.path中定义的路径 也可以将模块的文件路径加入到执行文件定义的路径中 ,可以用sys.path.append(路径)添加

    在导入一个模块时,如果该模块已加载到内存中,则直接引用,否则会优先查找内置模块,然后按照从左到右的顺序
    依次检索sys.path中定义的路径,直到找模块对应的文件为止,否则抛出异常。sys.path也被称为模块的搜索路径,
    它是一个列表类型
    
    
    编写一个规范的模块
    我们在编写py文件时,需要时刻提醒自己,该文件既是给自己用的,也有可能会被其他人使用,因而代码的可读性与易维护性显得十分重要,
    为此我们在编写一个模块时最好按照统一的规范去编写,如下


    #!/usr/bin/env python #通常只在类unix环境有效,作用是可以使用脚本名来执行,而无需直接调用解释器。

    "The module is used to..." #模块的文档描述

    import sys #导入模块

    x=1 #定义全局变量,如果非必须,则最好使用局部变量,这样可以提高代码的易维护性,并且可以节省内存提高性能

    class Foo: #定义类,并写好类的注释
    'Class Foo is used to...'
    pass

    def test(): #定义函数,并写好函数的注释
    'Function test is used to…'
    pass

    if __name__ == '__main__': #主程序
    test() #在被当做脚本执行时,执行此处的代码
  • 相关阅读:
    网桥的作用
    PMML辅助机器学习算法上线
    支持度、置信度和提升度
    特征预处理
    特征表达及处理
    卡方检验
    特征工程-特征选择
    AMBARI部署HADOOP集群(4)
    AMBARI部署HADOOP集群(3)
    ambari部署Hadoop集群(2)
  • 原文地址:https://www.cnblogs.com/h1227/p/12584971.html
Copyright © 2020-2023  润新知