python代码组织

python和其他编程语言一样,采用包管理代码,一个包中可包含许多模块。

使用模块最大的好处是大大提高了代码的可维护性。其次,编写代码不必从零开始。当一个模块编写完毕,就可以被其他地方引用。我们在编写程序的时候,也经常引用其他模块,包括Python内置的模块和来自第三方的模块。

使用模块还可以避免函数名和变量名冲突。相同名字的函数和变量完全可以分别存在不同的模块中,因此,我们自己在编写模块时,不必考虑名字会与其他模块冲突。但是也要注意,尽量不要与内置函数名字冲突。点这里查看Python的所有内置函数。

为了避免模块名冲突,python引入了按目录来组织模块的方法,称为包(package)。引入包后,只要顶层的包名不与别人冲突,那所有模块都不会与别人冲突。

每一个包目录下都会有一个__init__.py的文件,这是包的标志文件,只有目录下有此文件才是一个python包。

__init__.py可以是空文件,也可以有python代码,因为__init__.py本身就是一个模块,模块名为目录名。

aaarticlea/png;base64,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" alt="" name="图片 1" width="169" height="117" align="bottom" border="0" />

上面是一个两级包目录结构,abc.py的模块名是mycompany.abc,www.py的模块名为mycompany.web.www,两个文件utils.py的模块名分别是mycompany.utils和mycompany.web.utils。

注:模块名不要和系统模块名冲突,最好先查看系统是否已存在该模块,检查方法是在Python交互环境执行import abc,若成功则说明系统存在此模块。

使用模块

一个标准的模块示例如下:

#!/usr/bin/env python3
# -*- coding: utf-8 -*- ' a test module ' __author__ = 'Michael Liao' import sys def test():
args = sys.argv
if len(args)==1:
print('Hello, world!')
elif len(args)==2:
print('Hello, %s!' % args[1])
else:
print('Too many arguments!') if __name__=='__main__':
test()

第1行和第2行是标准注释,第1行注释可以让这个hello.py文件直接在Unix/Linux/Mac上运行,第2行注释表示.py文件本身使用标准UTF-8编码;

第4行是一个字符串,表示模块的文档注释,任何模块代码的第一个字符串都被视为模块的文档注释;

第6行使用__author__变量把作者写进去,这样当你公开源代码后别人就可以瞻仰你的大名;

import sys

导入sys模块后,我们就有了变量sys指向该模块,利用sys这个变量,就可以访问sys模块的所有功能。sys模块有一个argv变量,用list存储了命令行的所有参数。

argv至少有一个元素,因为第一个参数永远是该.py文件的名称。

当我们在命令行运行hello模块文件时,Python解释器把一个特殊变量__name__置为__main__,而如果在其他地方导入该hello模块时,if判断将失败,

因此,这种if测试可以让一个模块通过命令行运行时执行一些额外的代码,最常见的就是运行测试。

$ ./hello.py
Hello, world
$ python3 hello.py
Hello, world
$ python3
Python 3.5.2 (default, Nov 12 2018, 13:43:14)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import hello
>>> hello.test()
Hello, world

python交互环境导入时没有打印“Hello, world”,只有调用模块函数hello.test()才执行,方便模块导入。

作用域

在一个模块中,我们可能会定义很多函数和变量,但有的函数和变量我们希望给别人使用,有的函数和变量我们希望仅仅在模块内部使用。在Python中,是通过“_”前缀来实现的。

类似_xxx和__xxx这样的函数或变量就是非公开的(private),不应该被直接引用,比如_abc,__abc等。类似__xxx__这样的变量是特殊变量,可以被直接引用,但是有特殊用途,比如上面的__author__,__name__就是特殊变量,hello模块定义的文档注释也可以用特殊变量__doc__访问,我们自己的变量一般不要用这种变量名。

外部不需要引用的函数全部定义成private,只有外部需要引用的函数才定义为public

安装第三方模块

使用pip安装python模块。一般来说,第三方库都在python官网pypi.python.org网站注册。

要安装一个第三方库,必须先知道该库的名称,可以在官网或者pypi上搜索,比如Pillow的名称叫Pillow,因此,安装Pillow的命令就是:

pip install Pillow 

pip加速

配置pip阿里加速,添加 ~/.pip/pip.conf 文件,内容如下:

[global]
index-url = https://mirrors.aliyun.com/pypi/simple/
timeout =
[install]
trusted-host = mirrors.aliyun.com

模块搜索路径

默认情况下,Python解释器会搜索当前目录、所有已安装的内置模块和第三方模块,搜索路径存放在sys模块的path变量中:

>>> import sys
>>> sys.path
['', '/usr/lib/python35.zip', '/usr/lib/python3.5', '/usr/lib/python3.5/plat-x86_64-linux-gnu', '/usr/lib/python3.5/lib-dynload',
'/home/wang/.local/lib/python3.5/site-packages', '/usr/local/lib/python3.5/dist-packages', '/usr/lib/python3/dist-packages'] 

如果我们要添加自己的搜索目录,有两种方法:

一是直接修改sys.path,添加要搜索的目录:

>>> import sys
>>> sys.path.append('/Users/michael/my_py_scripts')

这种方法是在运行时修改,运行结束后失效。

第二种方法是设置环境变量PYTHONPATH,该环境变量的内容会被自动添加到模块搜索路径中。设置方式与设置Path环境变量类似。注意只需要添加你自己的搜索路径,Python自己本身的搜索路径不受影响。

参考:廖雪峰
模块 使用模块 安装第三方模块

python代码组织及模块使用的更多相关文章

  1. 孤荷凌寒自学python第十三天python代码的外部模块引用与基本赋值语句

    孤荷凌寒自学python第十三天python代码的外部模块引用与基本赋值语句 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 从结构化编程流行以来,代码便被分块存储,称之为模块或库. 在pyt ...

  2. python代码规范与标准库参考

    python代码规范与标准库参考 python代码规范参考文献: http://www.runoob.com/w3cnote/google-python-styleguide.html https:/ ...

  3. 翻译文章“AST 模块:用 Python 修改 Python 代码”---!!注意ironpathyon未实现此功能

    https://github.com/upsuper/blog/commit/0214fdd084c4adf2de2ed9912d644fb59ce13a1c +Title: [翻译] AST 模块: ...

  4. Python代码分析工具之dis模块

    转自:http://hi.baidu.com/tinyweb/item/923d012e8146d00872863ec0  ,格式调整过. 代码分析不是一个新的话题,代码分析重要性的判断比较主观,不同 ...

  5. Python代码缩进与测试模块

    一.Python代码缩进 Python 函数没有明显的  begin 和  end ,没有标明函数的开始和结束的花括号.唯一的分隔符是一个冒号 ( : ),接着代码本身是缩进的. 例如:缩进  bui ...

  6. 零基础学python之函数与模块(附详细的代码和安装发布文件过程)

    代码重用——函数与模块 摘要:构建函数,创建模块,安装发布文件,安装pytest和PEP 8插件,确认PEP8兼容性以及纠错 重用代码是构建一个可维护系统的关键. 代码组是Python中对块的叫法. ...

  7. #python自动化测试#代码执行时间测量模块timeit

    1. timeit模块timeit模块可以用来测试一小段python代码的执行速度 class timeit.Timer(stmt = 'pass',setup = 'pass',timer=< ...

  8. 【原创】Python 使用jmpy模块加密|加固 python代码

    本文所有教程及源码.软件仅为技术研究.不涉及计算机信息系统功能的删除.修改.增加.干扰,更不会影响计算机信息系统的正常运行.不得将代码用于非法用途,如侵立删! 使用jmpy模块 将py文件加密为so或 ...

  9. Python 代码风格

    1 原则 在开始讨论Python社区所采用的具体标准或是由其他人推荐的建议之前,考虑一些总体原则非常重要. 请记住可读性标准的目标是提升可读性.这些规则存在的目的就是为了帮助人读写代码,而不是相反. ...

随机推荐

  1. xmlns:amq="http://activemq.apache.org/schema/core"报错

    如题,项目集成ActiveMQ是配置文件报错 原因是:Spring命名空间配置错误,缺少相应的spring-bean.很显然,引用不到就是没有jar包啊. 我的解决办法,早pom.xml引用依赖 &l ...

  2. 基于EasyDarwin开源流媒体服务器框架实现EasyNVR H5无插件直播流媒体服务器方案

    背景分析 在之前的一篇博客<web无插件播放RTSP摄像机方案,拒绝插件,拥抱H5!>中,描述了实现一套H5无插件直播方案的各个组件的参考建议,又在博客<EasyNVR H5流媒体服 ...

  3. Kubernetes & Docker 容器网络终极之战(十四)

    目录 一.单主机 Docker 网络通信 1.1.host 模式 1.2 Bridge 模式 1.3 Container 模式 1.4.None 模式 二.跨主机 Docker 网络通信分类 2.1 ...

  4. Spring boot后台搭建一使用MyBatis集成Mapper和PageHelper

    目标: 使用 Spring  boot+MyBatis+mysql 集成 Mapper 和 PageHelper,实现基本的增删改查 先建一个基本的 Spring Boot 项目开启 Spring B ...

  5. VyOS 关于dhcp server 和dhcp relay 切换需要注意的

    dhcp server : /config/dhcpd.leases dhcp relay 两个dhcp 模式切换需要删除这个配置文件

  6. 【转帖】两年Flink迁移之路:从standalone到on yarn,处理能力提升五倍

    两年Flink迁移之路:从standalone到on yarn,处理能力提升五倍 https://segmentfault.com/a/1190000020209179 flink 1.7k 次阅读 ...

  7. Apache Kafka Consumer 消费者集

    1.目标 在我们的上一篇文章中,我们讨论了Kafka Producer.今天,我们将讨论Kafka Consumer.首先,我们将看到什么是Kafka Consumer和Kafka Consumer的 ...

  8. vue中指令绑定的v-if逻辑结构

    <!-- if判断 --> <div id="app2"> <p v-if="seen"> <!-- 给p标签绑定指令 ...

  9. epoll_ctl函数的使用

    #include <sys/epoll.h> int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);作用: ...

  10. 第13章 Salesforce Lightning应用程序

    13.1 Lightning应用程序 13.1.1 什么是闪电应用程序 Salesforce应用程序有两种风格:经典应用程序和闪电应用程序.经典应用程序在Salesforce Classic中创建和管 ...