自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(464)
  • 收藏
  • 关注

原创 Python 高手编程系列四百六十一:函数和方法

函数和方法的名称应该使用小写加下划线。但在旧的标准库模块中并不总是这样。Python 3 对标准库做了大量重组,所以大多数函数和方法都有一致的大小写。不过对于某些模块(例如 threading)而言,你可以访问使用混合大小写(mixedCase)的旧的函数名称(例如 currentThread)。留着它们是为了更容易向后兼容,但如果你不需要在旧版Python 中运行代码,那么应该避免使用这些旧的名称。

2025-08-29 10:24:43 786

原创 Python 高手编程系列四百六十:命名和使用

常量用来定义程序所依赖的一组值,例如默认配置文件名。好的做法是将所有常量集中放在包中的一个文件内。举个例子,Django 采用的就是这种方法。一个名为 settings.py 的模块提供所有常量,如下所示:SQL_USER = ‘tarek’SQL_PASSWORD = ‘secret’SQL_URI = ‘postgres://%s:%s@localhost/db’ % (SQL_USER, SQL_PASSWORD)MAX_THREADS = 4另一种方法是使用可以被 ConfigPar

2025-08-29 10:24:09 562

原创 Python 高手编程系列四百五十九 :Hy

如果你想接受来自其他程序员的任何协作,即使你对最佳代码风格指南有不同的看法,那么也应该坚持遵守 PEP 8。Hy(http://docs.hylang.org/)是完全用 Python 编写的 Lisp 方言。有.hy扩展名的模块都被看作Hy模块,都可以像普通Python模块那样导入。要记住,比遵守 PEP 8 更重要的是项目内的一致性。做的争吵,可能会变成一场永无止境并且永远没有赢家的口水战(flame war)。而且,如果整个项目的代码库处于成熟的开发状态,那么对其重新调整风格(restyling)

2025-08-29 10:23:32 298

原创 Python 高手编程系列四百五十八:抽象语法树

Python 语法首先被转换成抽象语法树(Abstract Syntax Tree,AST),然后才被编译成字节码。这是对源代码抽象语法结构的一种树状表示。利用内置的 ast 模块,可以得到对Python 语法的处理过程。利用带有 ast.PyCF_ONLY_AST 标记的 compile()函数或者利用 ast.parse()帮助函数,可以创建 Python 代码的原始 AST。逆向直接转换却没有那么简单,没有用于完成这项功能的内置函数。不过有些项目(例如 PyPy)可以完成这项任务。

2025-08-29 10:22:58 760

原创 Python 高手编程系列四百五十七:一些关于代码生成的提示

虽然类的调用签名相当严格,但 Python 并不强制要求返回参数的类型。and eval in Python(参见 http://lucumr.pocoo.org/2011/2/1/exec-in-python/)。”换句话说,即使你有一丝的怀疑,也不应该使用它们,而应该尝试寻找其他解决方法。• exec(object, globals, locals):这一函数允许你动态执行 Python 代码。对于元编程而言,最有用的显然是 exec(),因为它可以执行任意 Python 语句的序列。

2025-08-29 10:22:21 359

原创 Python 高手编程系列四百五十六:使用 C 或者 C++编写扩展

幸运的是,distutils 和 setuptools提供了辅助程序将编译好的扩展定义为模块,因此编译和分发可以使用 setup.py 脚本处。Debian/Ubuntu 中的 python-dev),但是在 Windows 下,它是默认分发的,可以在 Python 的。不幸的是,在 C 和 C++中,直接使用 Python/C API 编写自己的扩展是相当苛刻的。理,就像它们是普通的 Python 包。Pyrex 这样的工具,它们仅仅出于扩展的目的而提供了 Python 语言的超集,实际上它们只。

2025-08-29 10:21:48 331

原创 Python 高手编程系列四百五十五:基本的低级日志实践

格式的支持,例如 Apache/Nginx 的访问日志。Logstash 进程无法处理原始日志文件被移动或删除的情况,因此,Supervisor 和 Circus 都能够处理被管理进程的日志转储和保留,但是你应该考虑这是。是你唯一想要处理和归档的日志。流行的 Linux 发行版,那么很可能每个服务自己的日志文件都被一个叫作 logrotate 的。Fluentd 的最佳事件格式是 JSON,因为它增加的开销最小。将现有服务与 Logstash 集成非常简单,因为它可以监听现有日志文件对新事件的更改,

2025-08-29 10:20:59 289

原创 Python 高手编程系列四百五十四:监控系统与应用指标

python 是用 Python 编写的(https://github.com/agroszer/munin-node-python)。munin-node-c 是用 C 编写的(https://github.com/munin-monitoring/munin-c),munin- node-有一个 munin-python 包(http://python-munin.readthedocs.org/en/latest/),可以帮助你用。

2025-08-29 10:20:28 391

原创 Python 高手编程系列四百五十三:代码检测与监控

另一个值得注意的集成是能够跟踪通过 Python 内置 logging 模块记录的消息。启用这种支持只需要添加几行代码,如下所示:捕获 logging 消息可能会有一些不太明显的警告,因此如果你对这一功能感兴趣,请务必阅读有关这一主题的官方文档。这应该可以让你避免不愉快的意外。最后还有一点,就是运行你自己的 Sentry 可以省钱。“天下没有免费的午餐”,你最终将支付额外的基础设施费用,而 Sentry 只是另一项需要维护的服务。维护=额外工作=成本!

2025-08-29 10:19:54 730

原创 Python 高手编程系列四百四十九:可执行包中 Python 代码的安全性

• 用复杂的方式修改 CPython 源代码版本,这样即使得到了应用的反编译源代码,没。• 运行时删除所有可用的代码元数据(文档字符串),从而稍微降低最终结果的可读性。最重要的是应用的构建方式,以及将其部署到目标环境中所使用的流程。行文件中反编译嵌入代码并不是一件容易的任务,但它的确是可行的。执行文件并不是一个可行的解决方案。一旦你的把戏被识破了,你所有额外的努力都将变成时间和资源的。适合你的打包需求,也知道你的项目需要哪种类型的发行版。的应用仅提供向用户销售的服务,那么你有责任在自己的基础设施上运行它。

2025-08-29 10:19:23 211

原创 Python 高手编程系列四百四十八:cx_Freeze

cx_Freeze(http://cx-freeze.sourceforge.net/)是另一种用于创建独立可执行文件的工具。它是一种比 PyInstaller 更加简单的解决方案,但也支持 3 个主要平台:• Windows;• Linux;• Mac OS X。与 PyInstaller 一样,它不允许我们执行跨平台构建,因此你需要在想要分发的同一个操作系统中创建可执行文件。cx_Freeze 的主要缺点是它不允许我们创建真正的单文件可执行文件。

2025-08-29 10:18:48 493

原创 Python 高手编程系列四百四十七:独立可执行文件

在介绍 Python 代码打包的材料中,创建独立可执行文件是经常被忽略的一个主题。这主要是因为 Python 标准库中缺少合适的工具能够让程序员创建简单的可执行文件,用户不需要安装 Python 解释器就可以运行这些可执行文件。与 Python 相比,编译语言有一个很大的优点,就是它允许为给定的系统架构创建可执行的应用程序,用户不需要知道底层技术就可以运行。Python 代码作为一个包分发时,需要有 Python 解释器才能运行。这对于没有足够技术水平的用户来说造成了很大不便。

2025-08-29 10:18:13 717

原创 Python 高手编程系列四百四十六:源代码包与构建包

Linux 的系统或 Mac OS 中很常见,因为这些系统通常都会提供编译器,但这在 Windows。• build_ext:构建 C 扩展,并像 build_clib 一样将结果放在构建文件夹中。为了能够分发预构建的发行版,distutils 提供了 build 命令,可以通过 4 个步骤。sdist 发行版中,如果包里面包含 C 库或扩展,那么目标系统将负责编译它们。源代码发行版是最简单的,也是最不依赖于平台的。版本被用于标记存档名称,这个存档可以在任何拥有 Python 的系统上分发并安装。

2025-08-29 10:17:38 584

原创 Python 高手编程系列四百四十五:上传一个包

包与用户绑定,因此在默认情况下,只有注册了包名称的用户是它的管理员,并且可以上传新的发行版。任何人都可以免费上传新的包,唯一的要。你唯一需要的是一个包管理器,可以从 PyPI 下载新的发行版。对于 Python 包而言,如果没有有组织的保存、上传和下载方式,那么它是没有用的。使用 setup.py 进行上传时,你不能重复使用已经构建的发行版,每次上传时都必须。些打包用法的细节,以及关于如何创建你自己的包索引的说明。于大型项目来说,这可能是一个问题,因此有一个选项可以指定其他用户作为包的维护者,

2025-08-29 10:16:59 246

原创 Python 高手编程系列四百四十四:PEP 420 — 隐式命名空间包

不幸的是,在写作本书时,setuptools.find_packages()还不支持 PEP 420。在 3.3 版以前的 Python 版本中,无法使用 PEP 420 布局中的命名空间包。个包含 Python 包或模块(也包括命名空间包)的目录来说,如果它不包含__init__.py。念非常古老,也常用于像 Zope 这样的成熟项目,因此完全可以使用它,但是没有隐式定义。.py 文件中声明命名空间,并且未来可能会删除 setuptools 的这个隐式行为。最简单的方法不一定是最好的。

2025-08-29 10:16:06 387

原创 Python 高手编程系列四百四十三:setup.py develop 或 pip -e

构的 Acme 公司,共同的命名空间可以是 acme。与 SQL 相关的库,那么他可以创建一个在 acme 中注册自己的新的 acme.sql 包。如果你想添加一个新的子包 — 例如 templating,就会被迫将其包含在 acme 的源。可以编辑包的源代码而无需重新安装,并且它在 sys.path 中可用,就像正常安装一样。可以将命名空间包理解成在高于元包(meta-package)的层面对相关的包或模块进行分。常是一个被忽略的功能,在你的组织中或者非常大的项目中对于构建打包生态系统非常有用。

2025-08-28 19:25:52 211

原创 Python 高手编程系列四百四十二:管理依赖

许多项目需要安装和/或使用一些外部包。如果依赖列表很长的话,就会出现一个问题:如何管理依赖?在大多数情况下答案很简单。不要过度设计(over-engineer)问题。保持简单,并在 setup.py 脚本中明确提供依赖列表,代码如下:setup(

2025-08-28 19:25:21 610

原创 Python 高手编程系列四百四十一:常见模式

对于没有经验的开发者来说,创建一个用于分发的包可能是一项乏味的任务。如果不考虑元数据可能在项目其他部分找到的事实,setuptools 或 distuitls 在 setup()函数调用中接受的大多数元数据都可以手动输入,代码如下:setup(“”",‘etc’,这么做当然可行,但从长远来看很难维护,并且未来可能会出现错误和不一致。setuptools 和 distuitls 都不能从项目源代码中自动提取各种元数据信息,因此你需要自己提供这些信息。

2025-08-28 19:24:42 578

原创 Python 高手编程系列四百四十:setup.cfg

setup.cfg 文件包含 setup.py 脚本命令的默认选项。如果构建和分发包的过程更加复杂,并且需要向 setup.py 命令中传入许多可选参数,那么这个文件非常有用。你可以按项目将这些默认参数保存在代码中。这将使你的分发流程独立于项目之外,也能够让包的构建方式与向用户和其他团队成员的分发方式变得透明。setup.cfg 文件的语法与内置 configparser 模块提供的语法相同,因此它类似于常见的 Microsoft Windows INI 文件。

2025-08-28 19:24:13 798

原创 Python 高手编程系列四百三十九:创建一个包

都是最重要的而且和本章相关的。的内置命令,而 Extra commands(额外命令)则是由诸如 setuptools 这样的第三方包。虽然 distutils 是一个标准库模块,但建议你使用 setuptools 包来代替,它对标准的。(fork)、替代项目与完全重新编写,都想要彻底修复 Python 的打包生态系统。setuptools 派生的 distribute),但有些则被弃用(distutils2)。distutils 模块中描述的所有元数据,并将其合并为标准的 setup()函数调用的参数。

2025-08-28 19:22:06 259

原创 Python 高手编程系列四百三十八:有用的工具

要想对 Pylint 进行微调,第一件要做的事就是,使用-generate-rcfile 选项在项。pep8的输出比PyLint更简单,也更容易解析,所以如果你想要与一些连续集成解决方案(例。感兴趣的程序员来说,这是最佳选择,不需要任何额外的工具配置(像 Pylint 那样)。除了检查是否遵守某种任意的编码标准,Pylint 还可以给出有关整体代码质量的额外。是可调节的,所以如果你的团队使用一些与默认不同的命名和编码约定,你可以轻松配置。风格指南,介绍了一些命名建议,可以让你以后的代码更加明确;

2025-08-28 19:21:31 649

原创 Python 高手编程系列四百三十七:小心使用*args 和**kwargs 魔法参数

args 或**kwargs 不同,因为它可以提供能够操作数值并且能够独立发展的内部。但要注意,这可能会增加循环依赖的可能性,并且在__init__模块中添加的代码将被。签名的函数的装饰器,它是不可或缺的。如果参数列表变得很长而且很复杂,那么添加魔法参数是很吸引人的。另一种有趣的方法是创建一个容器类,将多个相关参数分组以提供执行上下文。魔法参数有时是无法避免的,特别是在元编程中。类的名称必须简明、精确,并足以使人理解类的作用。如果一个模块开始变得复杂,并且包含许多类,那么好的做法是创建一个包并将模块。

2025-08-28 19:20:51 287

原创 Python 高手编程系列四百三十六:避免现有名称

这种检查参数的方法是契约式设计(Design by Contract ,DbC,参见http://en.wikipedia.org/函数和方法的签名是代码完整性的保证,它们驱动函数和方法的使用并构建其 API。让我们来关注一个遵循 TDD 方法的代码库,它向正确的方向发展,每当出现新的缺陷。它们应该反映创建该元。尽量使用原创的名称,即使是上下文的局部名称。如果每个函数都有一个固定的、定义明确的参数列表,那么代码的鲁棒性会更好。如果库中的代码被外部元素使用,那么进行断言可能是有用的,因为传入的数据可能。

2025-08-28 19:19:49 742

原创 Python 高手编程系列四百三十五:property

trash(垃圾箱)或dumpster(垃圾桶),因为这正是他们的队友最终对这些模块的处理方式。堆不相关的、质量非常差的代码片段,其大小呈指数增长。如果一个元素保存的是布尔值,is 和 has 前缀提供一种自然的方式,使其在命名空。这样做的原因是它们的含义模糊、模棱两可,且没有向实际名称中添加任何信息。也在命名空间的构建中具有重要的作用,从而也影响代码可读性。如果你的代码不是在构建一种新的抽象数据类型,那么使用类似 list、dict、但现实表明,在许多情况下,它们都会变为危险的结构反模式,并且迅速增长。

2025-08-28 19:19:01 229

原创 Python 高手编程系列四百三十四:函数和方法

函数和方法的名称应该使用小写加下划线。但在旧的标准库模块中并不总是这样。Python 3 对标准库做了大量重组,所以大多数函数和方法都有一致的大小写。不过对于某些模块(例如 threading)而言,你可以访问使用混合大小写(mixedCase)的旧的函数名称(例如 currentThread)。留着它们是为了更容易向后兼容,但如果你不需要在旧版Python 中运行代码,那么应该避免使用这些旧的名称。

2025-08-28 19:18:38 502

原创 Python 高手编程系列四百三十三:命名和使用

常量用来定义程序所依赖的一组值,例如默认配置文件名。好的做法是将所有常量集中放在包中的一个文件内。举个例子,Django 采用的就是这种方法。一个名为 settings.py 的模块提供所有常量,如下所示:SQL_USER = ‘tarek’SQL_PASSWORD = ‘secret’SQL_URI = ‘postgres://%s:%s@localhost/db’ % (SQL_USER, SQL_PASSWORD)MAX_THREADS = 4另一种方法是使用可以被 ConfigPar

2025-08-28 19:16:57 634

原创 Python 高手编程系列四百三十二:Hy

如果你想接受来自其他程序员的任何协作,即使你对最佳代码风格指南有不同的看法,那么也应该坚持遵守 PEP 8。Hy(http://docs.hylang.org/)是完全用 Python 编写的 Lisp 方言。有.hy扩展名的模块都被看作Hy模块,都可以像普通Python模块那样导入。要记住,比遵守 PEP 8 更重要的是项目内的一致性。做的争吵,可能会变成一场永无止境并且永远没有赢家的口水战(flame war)。而且,如果整个项目的代码库处于成熟的开发状态,那么对其重新调整风格(restyling)

2025-08-28 19:16:23 383

原创 Python 高手编程系列四百三十一:抽象语法树

Python 语法首先被转换成抽象语法树(Abstract Syntax Tree,AST),然后才被编译成字节码。这是对源代码抽象语法结构的一种树状表示。利用内置的 ast 模块,可以得到对Python 语法的处理过程。利用带有 ast.PyCF_ONLY_AST 标记的 compile()函数或者利用 ast.parse()帮助函数,可以创建 Python 代码的原始 AST。逆向直接转换却没有那么简单,没有用于完成这项功能的内置函数。不过有些项目(例如 PyPy)可以完成这项任务。

2025-08-28 19:15:29 793

原创 Python 高手编程系列四百三十:一些关于代码生成的提示

虽然类的调用签名相当严格,但 Python 并不强制要求返回参数的类型。and eval in Python(参见 http://lucumr.pocoo.org/2011/2/1/exec-in-python/)。”换句话说,即使你有一丝的怀疑,也不应该使用它们,而应该尝试寻找其他解决方法。• exec(object, globals, locals):这一函数允许你动态执行 Python 代码。对于元编程而言,最有用的显然是 exec(),因为它可以执行任意 Python 语句的序列。

2025-08-28 19:14:48 394

原创 Python 高手编程系列四百二十九:Python 3 中新的元类语法

元类并不是新的 Python 特性,从 Python 2.2 版开始就一直都有。不过它的语法发生了重大变化,这种变化既不向后兼容也不向前兼容。新的语法如下所示:pass在 Python 2 中,其写法必须是这样的:= typePython 2 的 class 语句不接受关键字参数,所以 Python 3 定义元类的语法会在导入时引发 SyntaxError 异常。仍然可以编写在两个 Python 版本中都能运行的元类代码,但需要做一些额外工作。

2025-08-28 19:14:00 490

原创 Python 高手编程系列四百二十八:元类

现在第一个位置参数的命名约定为 cls,说明它已经是一个创建好的类对象(元类的实例),而不是一个元类对象。name、bases 和 namespace 参数的含义与前面介绍的 type()调用中的参数相同,• bases:这是父类的列表,将成为__bases__属性,并用于构造新创建的类的 MRO。然是 type 类的子类(参见图 3-4),因为如果不是的话,这个类将在继承方面与其他的类。metaclass 参数的值通常是另一个类对象,但它可以是任意可调用对象,只要接受。定义了对象实例的类也是对象。

2025-08-26 22:38:36 402

原创 Python 高手编程系列四百二十七:使用 __new __()方法覆写实例创建过程

()方法是非常合理的。那就是下一节将介绍的元类。

2025-08-26 22:38:05 335

原创 Python 高手编程系列四百二十六:槽

属性来为指定的类设置一个静态属性列表,并在类的每个实例中跳过__dict__字典的创建过程。不幸的是,这个问题不能用第 2 章“(4)保存内省的装饰器”一节介绍的方法(使用额外。Python 中的混入类是一种不应被初始化的类,而是用来向其他现有类提供某种可复用。虽然有这样的警告,但类装饰器仍然是对流行的混入(mixin)类模式的一种简单又轻。在类装饰器中这样使用闭包的主要缺点是,生成的对象不再是被装饰的类的实例,而是在。这种模式的框架之一。当然,上面的代码片段并不是很好的代码示例,因为其含义过于模糊。

2025-08-26 22:37:31 336

原创 Python 高手编程系列四百二十五:property

基于上述原因,创建 property 的最佳语法是使用 property 作为装饰器。如果需要修改property的工作方式,推荐在派生类中覆写所有的property。property 的 setter 行为的话,通常意味着也需要修改 getter 的行为。property 提供了一个内置的描述符类型,它知道如何将一个属性链接到一组方法上。不幸的是,上面的代码有一些可维护性的问题。在大多数情况下,这是唯一的选择,因为如果修改了。是利用当前类的方法实时创建,不会使用派生类中覆写的方法。

2025-08-26 22:37:00 249

原创 Python 高手编程系列四百二十四:现实例子 — 延迟求值属性

描述符的一个示例用法就是将类属性的初始化延迟到被实例访问时。如果这些属性的初始化依赖全局应用上下文的话,那么这一点可能有用。另一个使用场景是初始化的代价很大,但在导入类的时候不知道是否会用到这个属性。这样的描述符可以按照如下所示来实现:defdef’)else:’)下面是示例用法:m.lazily_m.lazilycached!

2025-08-26 22:36:29 353

原创 Python 高手编程系列四百二十三:最佳实践

在 Python 2 中,没有指定任何祖先的类被认为是旧式类。(self, obj, value):在读取属性时将调用这一方法(被称为 getter)。幸运的是,多亏了 Python 描述符的工作方式。• super 的使用必须一致:在类的层次结构中,要么全部用 super,要么全不用。它是一个类,定义了另一个类的属性的访问方式。为了避免前面提到的所有问题,在 Python 在这个领域取得进展之前,我们需要考虑以。Python 提供这一特性是为了避免继承中的名称冲突,因为属性被重命名为以类名为前。

2025-08-26 22:35:43 362

原创 Python 高手编程系列四百二十二:使用 super 易犯的错误

在下面来自 James Knight 网站(http://fuhm.net/super-harmful)的示例中,C 类使用。主要原因在于类的初始化。在 Python 中,基类不会在__init__()中被隐式地调用,所以。现在回到 super。如果使用了多重继承的层次结构,那么使用 super 是非常危险的,需要由开发人员来调用它们。()调用,但这又会导致第一种错误。混用 super 与显式类调用。

2025-08-26 22:35:08 344

原创 Python 高手编程系列四百二十:子类化内置类型

注意,零参数的 super()形式也可用于被 classmethod 装饰器装饰的方法。super 的简化形式(不传入任何参数)可以在方法内部使用,但 super 的使用并不。的速度更快,代码更整洁。最后,关于 super 还有很重要的一点需要注意,就是它的第二个参数是可选的。前面提到的使用实例很容易理解,但如果面对多重继承模式,super 将变得难以使用。当需要实现与某个内置类型具有相似行为的类时,最好的方法就是将这个内置类型子类化。类型的共同祖先,也是所有没有显式指定父类的用户自定义类的共同祖先。

2025-08-26 22:34:35 332

原创 Python 高手编程系列四百一十九:函数注解

Python 3 终结了这一分歧,其开发者只能使用被称为新式类的模型。怎样,知道两种模型在 Python 2 中的工作原理仍是很重要的,因为这有助于你移植旧代码。定义好之后,注解可以通过函数对象的__annotations__属性获取,它是一个字典,分重点介绍了与 Python 序列和集合相关的语法特性,也讨论了字符串和字节相关的序列。这也是为什么本章包含关于 Python 2 旧特性的大量内容,尽管本书针对的是最新版的。自定义函数使用的类型的完全可选的元信息,但事实上,它并不局限于类型提示,而且在。

2025-08-26 22:34:00 394

原创 Python 高手编程系列四百一十八:元类

现在第一个位置参数的命名约定为 cls,说明它已经是一个创建好的类对象(元类的实例),而不是一个元类对象。name、bases 和 namespace 参数的含义与前面介绍的 type()调用中的参数相同,• bases:这是父类的列表,将成为__bases__属性,并用于构造新创建的类的 MRO。然是 type 类的子类(参见图 3-4),因为如果不是的话,这个类将在继承方面与其他的类。metaclass 参数的值通常是另一个类对象,但它可以是任意可调用对象,只要接受。定义了对象实例的类也是对象。

2025-08-26 22:33:29 288

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除