python代码组织

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

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

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

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

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

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

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKkAAAB1CAYAAAA1KcF7AAAACXBIWXMAAA7DAAAOwwHHb6hkAAANe0lEQVR4nO2dzWsbWRbFz6L/gx6kobEUGvWmTTQYBKbdWky8tSQY0bshGGIYUKHVgGUEWQdE21ujggE3iGyDF1J5m8zC7cYgMKOQbFo0kUJoGXo9y5n7ql6VXumjJDll65V0fw0dRU/1qhwf3Xofp+794n8EGEZjvlj2BTDMLFikjPawSBntYZEy2sMiZbSHRcpoD4uU0Z45RTrAxeEBTlMFFFpNNPM11FBFtQUUXlgobcn295so/3SMvRjQqeeUdurixkTuedPp7tsyyqkeEkYJadF7q4KD+juv7exkD3F0YOaq6OYLAJ0TRg27b6reORKvRP8FlI0uTuWxm8YZjvNxec3O8fKMw+sY/Vl85xy/bvfa/H0zD8mcIo1j76SGXq6B5E8Wzq4rOMEZLOsWZr0DbKWxd1RG7zpjC1SQJlGRvBxh3F6g8jKJM8uyheAIFqgZzuuD/j71lXYOFG3Up2WkUfqpjMqzHvbpOJB4Lp9asL66gHk9wB6JptwlsfVr3rFCYOaNK8YYsi/O6LU4oxCmic6W+FL4fxYr5gjx/GbPPs533eInzx+i3G8jwwJdGovd7vP7tggHSGF3W/zSbodtsT1k+yQEuNHxEskfSnbT4LqH3aMSvF8ziUXoTtC5EmJND/uhttqV6Cdt95MyivafHZJOdst/SoqdKP8wPFYI7FJ+aQT9lweoPndbCxT9x38WQXwjhe7HAR0nrjCNYsLExW3aab85R2+nhL2F/qGYMAl1TJr+IQmzNUA6f4vzfhalfJi9TyKFRGxyy6B1gp6IvDIidurm3L3G81n0hNiNGC6ukigaIVwqc2fCnTi50fSGXu+UvLfj20m8ftWhW7Qb9cR4Udxuafy6A7pFk8C34LVdggQ+1wmbaLSKw7HizaV33ts+kNyWH6PhRoPGmftzi01G05skeokMR9Els8DEiSYh74Fu4gyHoMnKMxMJK0uTmioqieGkQkTTyo/A4YlyOIn3MFFBLicnRxhOsBArInmYs8eoapst5GenzsRmwyLZNlE9pHHtEV1D/QDmxhmSdAtP9Q+oX3moPQGCvI5dNJ7lcGr/jSZJeXn8SQZt5Wc53m6jQhO6d9S/uWEpY1GKpjn6ulgs0WWzwMTJUiLKMSx5K0+7g0uXTz2knirjT7eH/PCY4L5daOJEfXsRdYtu3e7ZbeHQF+clkDXoM5MiJH0xjn0CK3l9+c83+jmJCMVyPMwsl/Bu9+oSE/5LEeif9/oL7tTFkhe9yDXDXR4SKxEUweWiFg0Zjr0JFrMcwhOpPWMv2cs5J/j7vUegNEVQ6z4mNGMRmFk2vOPEaA+LlNGe1RSpHB8Pt0KZKLOaIqXx8ZnRxfmyr4MJBY1F6hpECqhZJTkRG3nPt6KgrL2O9QGfiYSJFhqLNI3SC9vqoawUOKYTXGfoFQlQNa3YgjTRsYafbz5vkHAdE4lqXGGixb2I9F39gAQh//L4EfD2w+QPzopuXyVJkAP6s43Ks9fYpUiZue4hub0H3LbRfX+Kg9yp/5ibkrfFumkcDiPriHGFiQ73ItLQFtdjGSRxi8H1a6SMXfRIsAl6JyOEdyscUsHnSW3wzX0V0Ph2L4iTKNto91PIGhn06ydoYB9iZ98W8JtzdPKlqZGx+dxE1r39C5MJss6xTKTQXKTCuvwaVRKmGHnGEkBvw5VkHHtHSVRyObzzPi0nT59M201foOjb8NrFZIt3kqKI9iK1jSnKa5+Fb9oWZszZorXJszCjTugi/ePtb/gNf5A4whwPipn75fDWzawV2kdShgldpF8+/hpf48uwu2XWGI6kjPawSO8EjZEP+yjeYZvVfnx645iNLwvAIr0TaZRO7jaFG1uhcLkxYYpHXFi8Y7BIF8TNcDK2pWubXboo5IFmS67MqlZB5bGUUQuh1yeaEzKu3AOuldEoo1uXj8ponMWFRbogzmMrA1zU2/4G2x5YUbKxiCHBBQZbUsjumq4dMSf0ufOAkVRaGQ/qPdQsy1nWUww4umVxiZBIm6jm3DjzCH/BB/xnyieXZ3ZOKRlVYkji0k64oquDYFN9GtZnwNEri0uERKr6SpkwCDLg6JTFJUIiXSPE+NVOsBGCSVuOPyeNJ5svL1B0hyNjmWP0yeLCIl0IfzpJtISXVTW1UEsdSAjfgJsXwM6aQr9iNb2lO0HK14Ym7K0sRCoWJxmLc9e472FCIdXDgZf+xc0cM0SXLC4s0oUYyaqioppaBKN5AaZmcJmj789ha+S6VGicaRkBZ9Qki0tEDCZdvKX//gws/R9sJbgxZVTPoTnp6QjNsrisXST1ZZUeJU5fg8Hvk9uW8CBf4LV+81d88+u/8evExkkPJSoERVeBZllcImIwSeExfqf/fz7TE6fpx+xrPXqoS1kqaxdJmejBIr0TUwwmXh4AXtMNExbpJGaaPaYYTORYb5HU58xs1lCkcq1TrlGOmidmmT2mGkzmObPXN01t8gWkEkWUglZB5CwbRhmpusx6rUZpN3K7663urHzFsrWsoUjFemTNXnQX2JOTDROVj7J1htljqsFkFiSgy4QoKyT3d0iwDRSDjxGz7Bc9EqJIjCEzsQghHl44u1Fiv11MrNwNAZH23eihvb06AhVESKRRMJgEYOcJUDK7iGhnzCklpZyPLcQnJtq3sN8bVnyxTXYPVPXlYYmQSKM+GfHXBlALnM1ic1odIIFSPyum1M5aJSIk0pDp9jGw6+PRGFWM64wpt96QzB6zHxtxS1+Ofxnf1dVMLQO0+0lklGjpRNMOkiPvrwprKtI0sqmqTHa2ibJRQNMuuyOHCVPNHgEGk5grMrdNTnOUoUfzeW54rJjszCmoTfpcQ8nUIvr07QfZ0TSHy51JVVyiz5qKdLwwxF5evU1OM3sEmUCmlfqRrTN3jwKOTxRxHLSNSdG1jzKKuo3DQ4INJjojhhqyEFquPmlM7o/em4nMSlaSXttIGglmGj2Co/eqsHYGEyZ6cCRltIdFymgPi5TRnvUT6agpQ33vu++BX36e3Jb/BwqtfwWX7JlxzqhkDNGN9RPpqClDvndmAO3tEhJ/Mqe0/Q17O+LRkmkle4LPGaWMIboRIZGGZzARufeFQSN2TRHrzS5FtMxwqzGoDQEle+YgKhlDdCMiIg33cd/4Nont0wDtNymUn/RIlKTMRMbZ+gxqCyrZMwdRyRiiGxERaciIUHrdRi+VRWm7D/PHBvD0eHZbUMkelxXIGKIb6ylSUOh7UyXxWfRSJBbrIbE1T1tQyZ7ZRCVjiG6sqUid7cTh69KcbTNK9ghWIGOIbkTEYBJxIpYxRDfWNJI+MBHLGKIbETGYMOsMR1JGe1ZepHcuSXMjHnMu8rakBqy8SKeWpJkFjSOPJwq7A7MOlAyegz8UqyvSqSVp5CMXqQIKLZmlxDfjHj5sN7Yg7+V6EmVw5HuqGeWefgbOYLKqTC1JI9Y+a+jlGkjKrCD+Z+DlFiz9ws3rkT7tWXr24SIpZzCxuReRvqsrmToePwLefpj8wWV+45WsIPGNFLofByRCTX+1nMEkfNgHGS6cwYT5DMT49gQ4CmOHiDOYTGNlRTqYWpImRmKgidF7oJugiL/d9p5ttzOYYDg5so8UwxbfsCSNLHJwfSL2pOyetzA5g8mKEpQxxP+s+uiW5IwtTIxnPwkHzmAyDTaY6AxnMLHRN5L6nEGj6JafdCSR2Qjffwf8/MuUxqB1Vs5gYqOvwSRSzqB7qmbH2OgbSRlGElmROs+qRz37MzMPkRVp2jhDuXu+7MtgHgDtRepb75y0jaqYPkZ3unzH5sso0x8ZI2Ablg0dWqK9SOMb+ySStCeSSmugCLGJ6ksSiGV56WrMGzmzF88V9fdhWXKfpiWTPQSdjA0dWhIBg8klqrmq97dNXwGGTZSPhseLdDWXIsHCVhqdK6CmLO0sVPh2zQ0duqG5waQD82XSi5QYs8+lEOS9uCvrbujQDb1v97d9dFMJL1J2Xp3a++1D6HZfz3qL4YNWA9hxEi6kd+AfGtjjxx72raFRgw0d0UBvkVLU2lfMHKIeJ2Qpm+yVI7Dykwa1u5MjpewMjR/3r4bHLlKsbN0NHbqht0gxwczhZgDZGr6/NyWaBRtB2NARFdhgosKGDi3RPpI+KGzo0BJ9DSYMI+FIymgPi5TRHhYpoz16i9Q1dNjbpxm05czadt5/NWruGClXM8HZP9OxzwYTLdFbpCJjyAsgdyV2neLIPNlE4ambfGzU3JFG6YVdaMZbNkp527Mk4MP+7HVNNphoif4GE1ED6WPF2VVSd5SgVuwQohn4q3aQgBzjh1jbbCB5dDy/kNhgohWhi3Qht9ECFPKFCQ+6KfWPPk2qfeQsvveeLvZsPBtM9ELv2z3kYyJwxoDFFkXU+r7v6Uo3mlI8Rda3BaoIVNzmbQdVhqJe3NfOBhP90Vqkwqgsam7i2z5JJYb2G7rlv6+iklCtgCKaVnCCw5F6SufO9uXznBeBhYVwHthgohdai3R06DBtS/K2n8K+MTLinFVMgQ0mkUFrkc7CrW7skP38ZLZsMNGSSIs09JxMbDDRkkiLlFkPWKSM9rBIGe1hkTLawyJltIdFymgPi5TRHhYpoz0sUkZ7/g+HIbkX9IeMOQAAAABJRU5ErkJggg==" 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. forever at your feet

    A locket on a chainA bow that's made from rainA briar grows entwined with roseI've come to be foreve ...

  2. Anaconda无法更新

    在安装完Anaconda,更新包时 C:\Users\Administrator>conda upgrade --all WARNING: The conda.compat module is ...

  3. linux下RAR和ZIP安装和使用

    服务器没装rar,对于上传是压缩的文件来说,是个很大的问题. 源码安装rar: 1. 下载: wget http://www.rarlab.com/rar/rarlinux-x64-4.2.0.tar ...

  4. Postgresql中的large object

    1.初识postgresql large object 一位同事在对使用pg_dump备份出来的文件(使用plain格式)进行恢复时,觉得速度非常慢,让我分析一下是什么原因. 我拿到他的.bak文件, ...

  5. SpringBoot常用注解(一)

    控制层:controller 1.@RestController注解相当于@ResponseBody + @Controller合在一起的作用.即这样写每一个方法返回的是 JSON 类型的数据. 2. ...

  6. 前端HTML学习心得

    学习最好的效果就是理论加实践--Hanks!!!(给大家打鸡血的哈哈哈) 前面的学习我教大家怎么搭建简单的前端开发环境,现在我教大家怎么使用工具学习(从入门到放弃哈哈,不不不,这是以前的我,现在我下了 ...

  7. 微信小程序获取位置

    获取位置 getLocation wx.getLocation({ type: 'wgs84', success (res) { const latitude = res.latitude const ...

  8. vxlan 跨网段虚拟机迁移

    一些服务器虚拟化软件可实现在两台虚拟化的物理服务器之间对虚拟机做动态迁移,迁移至另一中心的虚拟机不仅保留原有IP地址,而且还保持迁移前的运行状态(如TCP会话状态),所以必须将涉及虚拟机,迁移的物理服 ...

  9. Python-22-并发编程

    一.进程 1. 什么是进程 狭义定义:进程是正在运行的程序的实例(an instance of a computer program that is being executed).广义定义:进程是一 ...

  10. gin - 读取Body后再次赋值

    这样就不影响后面读取了