Python项目中如何优雅的import

Python项目中如何优雅的import

前言

  • 之前有一篇关于Python编码规范的随笔, 但是写的比较杂乱, 因为提到了import语句, 在篇文章中, 我专门来讲Python项目中如何更好的import

标准库与第三方库的导入

  • 导入一个模块, 如果模块名太长, 则使用import as; 如果是导入子模块, 则使用from import as
  • 如果需要导入类的, 则使用from import导入类, 如果要导入某一个模块的多各类的话, 则类名使用逗号分隔
  • 示例
    1. 导入sklearn中的svm中的SVC类
    
    import sklearn.svm
    from sklearn.svm import SVC
    1. 导入numpy中的random模块
    
    import numpy.random as nprand
  • 总结: 如果导入类的话, 一定是import somemod 和 from somemod import class两个语句组成的; 如果导入一个不同的模块的则, 则一般就是import somemod

项目模块导入

  • 项目目录
wxoa ?? tree -Cl
.
├── main.py
├── test
└── wxoa
    ├── __init__.py
    ├── __pycache__
    │   └── __init__.cpython-35.pyc
    ├── entity
    │   ├── __init__.py
    │   ├── __pycache__
    │   │   ├── __init__.cpython-35.pyc
    │   │   └── user.cpython-35.pyc
    │   └── user.py
    └── util
        ├── __init__.py
        ├── __pycache__
        │   ├── __init__.cpython-35.pyc
        │   └── ioutil.cpython-35.pyc
        └── ioutil.py

7 directories, 12 files
  • 主程序为main.py, 项目名为wxoa, 存放源代码的目录也叫wxoa, 也是一个python package
  • 导入规则
    • 存在python package(所以这里不包含main.py)中的python文件包导入的规则

      • 使用from . import somemod导入当前目录下的模块
      • 使用from ..somemod import submod导入上一级目录的somemod目录下的submod模块
      • 如果名称太长则使用as缩减
    • 不在python package(就是这里的main.py和test目录下的文件)中的python文件的导入规则
      • 使用from somemod.submod.subsubmod import some导入, 注意这里不使用.号起头, 关于使用., ..的作用在下面会说明, 如果使用了.起头则会报错, 提示父模块没有加载
      • 其中somemod就是我们的源码的python package包名, 在这里就是wxoa
      • 如果名称太长则使用as缩减

关于.和..

  • 在包导入中, 如果出现了.和..起头, 则会涉及到package(不是module)的关系, ..表示上一级package, 这个上一级package需要有一个__init__.py才是合法的, .表示当前package, 当前package需要有一个__init__.py才是合法的
  • .和..涉及到的python程序的启动项, 这里会比较复杂, 简而言之, 在涉及到..表示的上级package的时候, 如果python程序的启动文件就是在这里则Python解释器不会认为..表示的上级目录的package是一个合法的目录, 尽管有__init__.py文件, 因此会报错; 这样就给代码测试带来的麻烦, 不能直接在使用..和.中直接测试代码, 也就是

    if __name__ == ‘__main__‘: pass

    因为这样已启动程序就会报错, 所以报错, 在下面提出解决方案

关于.和..带来的麻烦的解决方案

  • 和上面展示的项目目录一样, 主启动程序, 项目源代码(主要是模块), 测试代码分离, main.py在项目目录下, test(普通的文件夹, 存放python测试文件)也在项目目录下, 项目源代码就是wxoa
  • 在main.py和test目录下的python文件中导入自己项目中的模块, 就不要使用.和..起头了, 否则会报错, 而是使用绝对路径, 如这里的, from wxoa.service import user

原文地址:https://www.cnblogs.com/megachen/p/10048738.html

时间: 2024-08-28 16:16:31

Python项目中如何优雅的import的相关文章

Python语言中循环引用(import)失败的解决方案

最近在开发智能家居项目hestia-rpi项目中,由于代码结构层级划分不合理,导致了循环引用(import)module失败的问题,错误如下: 1 2 3 4 5 6 7 8 9 10 Traceback (most recent call last):   File "./main.py", line 8, in <module>     from hestiarpi.library.server import server   File

在一个多模块的python项目中,如何在子模块中引用项目的根目录?

参考:http://codereview.stackexchange.com/questions/20428/accessing-the-contents-of-a-projects-root-directory-in-python 有时候开发稍大一点的python项目,需要用到多个模块,多层目录.而在项目的子目录中的模块,有时候需要存取项目其他目录中的文件或模块. 比如: 项目文件布局如下: my_project|- main.py|- main.cfg|- module|  |- mod1.

Python项目中的单元测试

引入 单元测试负责对最小的软件设计单元(模块)进行验证,unittest是Python自带的单元测试框架. 单元测试与功能测试都是日常开发中必不可少的部分,本文演示了Python中unittest单元测试框架的基本使用. 一个简单的测试例子 定义一个类,简单的实现add.sub两个方法,并对其进行单元测试. 待测试的m1.py文件内容如下: class MyClass(object): """just a test case""" def __i

python 项目中的 requirements.txt

背景 java项目的话,包依赖一般都是maven管理,当然还有gradle,对于包的管理非常方便,maven的话只要在pom.xml中添加依赖包的maven坐标就可以了的,那python呢 ? 解决方法 现在的python版本都自带pip功能的,安装第三方包直接pip install xxx,和linux 上的yum一样方便,其实pip提供了一个freeze 功能,可以把已经安装的依赖导出到一个文件中,一般命名为:requirements.txt #导出依赖到requirements.txt p

如何在python项目中写出像Django中一样功能的settings

一  核心文件目录结构 二  实现代码 resdme: 在实现此功能主要用到的知识点及模块: 1.反射 3.内置方法dir # 全局配置 NAME = 'root' # 用户配置 NAME = 'personal' from lib.conf import global_settings # 全局默认配置 from config import setting # 用户个人配置 class Settings(): ''' 需要注意的是: 1.在初始化的时候要将全局的配资放在个人的前面 2.因为如果

PyChram中同目录下import引包报错的解决办法?

相信很多同学和我一样在PyChram工具中新建python项目的同目录下import引包会报错提示找不到,这是因为该项目找不到python的环境导致的: 解决办法: 1.首先找到Python的安装文件目录如我的是:C:\Python27\Lib\site-packages 在目录下新建--项目名.pth---文件内容如下: #项目路径C:\seleniumtest\myweb C:\seleniumtest\myweb\myweb #应用程序路径 C:\seleniumtest\myweb\bl

Python项目使用memcached缓存

前言许多Web应用都将数据保存到MySQL这样的关系型数据库管理系统中,应用服务器从中读取数据并在浏览器中显示. 但随着数据量的增大.访问的集中,就会出现数据库的负担加重.数据库响应恶化. 网站显示延迟等不良影响.分布式缓存是优化网站性能的重要手段,大量站点都通过可伸缩的服务器集群提供大规模热点数据缓存服务.通过缓存数据库查询结果,减少数据库访问次数,可以显著提高动态Web应用的速度和可扩展性.业界常用的有redis.memcached等,今天要讲的就是在python项目中如何使用memcach

使用junit4测试spring项目中service方法

使用junit4测试项目中service方法 1 import java.util.HashMap; 2 import java.util.List; 3 import java.util.Map; 4 5 import javax.annotation.Resource; 6 7 import org.junit.Test; 8 import org.junit.runner.RunWith; 9 import org.springframework.test.context.ContextC

iOS 项目中的文件 - projectname-Info.plist - projectname-Prefix.pch

A.项目中的常见文件 1.单元测试Test 2.Frameworks(xCode6 创建的SingleView Project没有) 依赖框架 3.Products 打包好的文件 4. projectname-Info.plist 全局配置文件 所以最好其他的plist文件不要带有Info字眼 (1)更改项目名 a.修改Bundle display name b.clean c.模拟器删除app,重新生成 (2)Bundle Identifier App唯一标识符 (3)stroyboard入口