python导包相关

reference汇总

导包注意点

summary

reference: 《面试官一个小时逼疯面试者》之聊聊Python Import System?

  • 关于Python 2.X与Python 3.X导包机制的两大差别

    • 从Python3.3版本开始引入了“Namespace Packages”这个新的包类型,不需要 __init.py__就可以导包

    区别Namespace Packages和之前的普通package的一个方式就是,看看是否有__file__属性,因为之前__file__属性就是__init.py__文件的位置,没有了__init__.py自然没有这个属性了。

    • 绝对导入(2.6之后)与相对导入(2.6之前)
      • 绝对路径要求我们必须从最顶层的文件夹开始,为每个包或每个模块提供出完整详细的导入路径

        from package1 import mudule1
        from package1.module2 import Fx
        from package2 import Cx
        from package2.subpackage1.module5 import Fy
        

        清晰,但是需要hard code ,可扩展性也不好。。搞到后面还会长

      • 相对导入分为“隐式相对导入”和“显式相对导入”两种

        # package2/module3.py
        import module4 # 隐式相对导入
        from . import module4 # 显式相对导入
        from package2 import module4 # 绝对导入
        

        Explicit is better than implicit

        但是会有如下两种常见问题。规避方法就是在顶级目录topDir的外部使用python -m topDir.run而不是在topDir目录下使用python run.py的方式运行入口文件run.py

        • top-level package区分问题
        • parent package异常问题
          可以跑一下我的测试代码,简单感受一下

        至于为什么要这样干,可以看下一小章节的讲解

python -m topDir.run 和 python run.py区别

reference:* stackoverflow:相对导入不能在__name __为 __main__的文件中使用

假设现在有如下文件结构

* app
	* __init __.py
	* submodel1
		* __init __.py
		* code1.py
	* submodel2
		* __init __.py
		* code2.py

现在 在code1.py里面要导入code2.py ( from ..submodel2 import code2 ) ,在submodel1的路径下直接python code1.py是行不通的(报错Attempted relative import in non-package

Relative imports use a module’s name attribute to determine that module’s position in the package hierarchy. If the module’s name does not contain any package information (e.g. it is set to ‘main’) then relative imports are resolved as if the module were a top level module, regardless of where the module is actually located on the file system.

  • 在__ name__ = __ main__的命名空间里面,不能使用相对路径进行导包(reference第一个link里面的第1个answer)
  • 就算python -m code1也没用 (reference第一个link里面的第二个answer)
    得在整个包的最外面(也就是app路径外面)使用 from app.submodel1 import code1才可

misc

什么是PEP

Python Enhancement Proposals

全部的PEP目录汇总在PEP 0中

值得一读的PEP
pep8里面讲到一些编码规则 必读 顺带一提里面提到的命名规则

import规范

  • 文件顶头import
  • 三部分 按顺序import : 内置lib、第三方lib、自己写的lib,中间用空行隔开

规避嵌套import带来问题

reference: hesy blog – python 规避嵌套import带来问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值