Python中str的+=性能分析

在一般的语言中(Java:正式在下!),字符串是不能用+或连加来进行大量构造的。 因为字符串是不可变对象(或基本类型),N个字符的连加,会额外产生N-1个对象。 但Python是个例外。

让DRF的URL支持前缀的一种方式

DRF(Django REST Framework)不支持带前缀的资源。 所有资源,默认都应该在URL的根路径下。 这里提供了一种支持前缀的解决方案,并且支持带参数的前缀。

正确使用Celery中的revoke来取消任务

取消一个在排队的Celery的Task,操作是简单的,用revoke就行。 但是,如果要很好地取消一个正在运行的Task,则没那么容易。

在Linux安装或管理多个Python版本

从源码安装、手动管理,到update-alternatives,再到pyenv,又回归pyenv-install+update-alternatives。 本文算是把Linux下,Python多版本管理的主要骚操作都讲完了。 此外,也稍微提点了一下原理。

在Python中判断两个浮点数的相等

如何判断两个浮点数是否相等? 这是一个所有编程语言都有的小坑。 Python中虽然统一了float和double,但不可避免地仍然有这个问题。

Celery重复执行一个Task的解决方案

在系统负载较高,消息队列里堵了太多东西的情况下,Celery容易出现重复执行一个Task,甚至不止一次的情况。 本文给出三个解决方案。

利用pyinstaller打包Python程序为一个可执行文件

有时,Python发布的程序需要被打包为一个文件夹、甚至一个文件发布。 目前(2020)最佳的策略是使用pyinstaller。 本文介绍了这种方案的配置方法,以及它的2个问题。

定制Powerline的显示内容

本文内容承接《安装Powerline并配置Vim、Bash、tmux、IPython、pdb》,介绍Powerline显示内容的定制方法。 并且介绍自定义组件的开发方法。

安装Powerline并配置Vim、Bash、tmux、IPython、pdb

本文主要介绍基于Powerline的CLI美化配置。

基于Redis配置Celery

作为一个分布式异步计算框架,Celery虽然常用于Web框架中,但也可以单独使用。 虽然常规搭配的消息队列是RabbitMQ,但是由于某些情况下系统已经包含了Redis,那就可以复用。 本文撇开Web框架,介绍基于Redis配置Celery任务的方法。

Python利用S3的Presigned URLs实现无鉴权上传与下载

S3协议操作对象存储服务,通常是实现上传下载功能。 但是在某些场景下,程序不具备操作权限,或为了安全原因而缩小权限配置,需要实现无鉴权的上传与下载。 这时可以用S3协议的Presigned URLs来实现无鉴权读写操作。

用Python操作Kubernetes的Job

官方缺乏文档,只有示例。 本文给出Python SDK操作Kubernetes Job的更多示例代码,以及相关解释。

在中国快速下载Visual Studio Code

在中国,想要下载Visual Studio Code,有时真是一件不容易的事。 本文提供一个Python脚本,自动从中国的azure下载。能略快一些。

Python多重继承super()的MRO坑

Python的面向对象类继承方面,采用了类似C++多重继承的方式。 本文介绍了MRO,以及在多重继承中使用super()遇到object的一个坑。

设置Python的wheel包自动根据系统安装不同的依赖

有时候,一个Python包,在不同操作系统,需要使用不同的依赖包。 比如,pykerberos只支持Linux平台,而Windows平台则需要使用winkerberos。 除了在setup.py里写if else这种丑陋的做法以外,可以使用两种setuptools支持的方式。

用pylint-django插件来检查Django项目

直接用Pylint来检查Django,容易产生误报。 对此,有个Pylint插件pylint-django,可以解决这个问题。 同理,还有一个pylint-flask插件可以解决Flask的问题。

Python中使用re.MULTLINE匹配一个字符串的多行

通过一个匹配多行并计数的案例,展示了re.MULTILINE的用法,和一些Python代码的优化细节。

Python中的虚拟环境(Virtualenv)及其工作原理

也许Python由于2和3的分裂,Python发展出了虚拟环境(virtualenv)的技术。 本文介绍了Virtualenv的安装、使用与工作原理。

利用Nginx架设Webdav服务并用Python的requests使用

本文介绍如何利用Nginx(Docker)架设Webdav服务,并用curl以及Python的requests进行简单的使用。

用pytest-httpserver来测试requests

在Python程序中,用[requests]发起网络请求,是常见的操作。 但如何测试,是一个麻烦的问题。

配置yapf和isort的Vim与Pytest插件

用Vim写Python,曾是一件流行的事,而今已经变得小众。 实际上,Vim仍然是Python开发的最佳利器之一,在很多方面,甚至优于PyCharm这样的IDE。 本文会基于Vim,介绍Python的风格统一与格式化方法。 并且,还会集成它们到pytest中去。

Python中的多进程(multiprocessing)

Python中的多线程、包括协程,由于CPython的GIL(Global interpreter Lock ,全局解释锁)问题,只能实现并发(Concurrency),不能实现并行(Parallelism)。 因此,在并行计算场景,多进程是Python最简单的选择。

Django中的logging

对网站、微服务来说,log是比较重要的运维工具。 Django的log,主要是复用Python标准库中的logging模块,在settings.py中进行配置。 此外,也提供了一些独特的扩展。

用cookiecutter来创建新项目

因为Python系缺失一个Wizard,也缺少项目结构的标准,于是出现了cookiecutter。 这是一个项目生成器,也可称为引擎,因为它只完成了最核心的功能。 真正决定一个项目长什么样的模板,却可以自由定制。 也因此,它能生成任何一种语言的项目。

Python中的atexit

atexit是标准库中一个简单的小模块,作用是提供退出的回调。 如果有什么事是在退出时需要做的,就可以使用它。 但仅限于比较简单的程序。 实际上,最好不要使用它。

用setuptools_scm来自动控制Python包的版本

手动管理Python包的版本号一段时间后,寻求自动化的手段,是自然而然的。

pytest的插件介绍:pytest-cov、pytest-pep8与pytest-flakes

pytest不仅是一个功能强大的测试框架,同时也是一个插件化的测试平台。

用Python做数据分析的环境初始化

从一个标准的Python环境,到一个可以做数据分析的环境,还需要有一些准备工作。 本文就是记录这些准备工作,便于查阅。

在setup.py中配置SWIG模块

SWIG的一个优点是,受到了distutils/setuptools的原生支持。 在setup.py文件中,可以很方便地直接把*.i文件作为源文件进行配置,而不用手写编译脚本。 本文通过一个Demo项目,来讲解如何在setup.py中对SWIG进行配置。

用SWIG向Python提供C++里STL的容器

在Python项目中使用C/C++的代码,除了少数场景,其它都有数据交换的需求。 而C++的vector、map等,则是常见的数据容器。 本文介绍如何利用SWIG,在Python中调用STL的string、vector和map。

解决setup.py编译C++代码的-Wstrict-prototypes警告

本文介绍了一个在利用setuptools的Extension来编译C++代码时,会出现的-Wstrict-prototypes警告,及其解决方案。

pytest中使用mock

单元测试的条件有限,在测试过程中,有时会遇到难以准备的环境。 比如,与服务器的网络交互、对数据库的读写等。 而mock的技术,就是在测试时,不修改源码的前提下,替换某些对象,模拟测试环境。

pytest中的fixture

会写测试,和写好测试,是差距很大的两种境界。 本文介绍pytest中setup与teardown的写法,算是单元测试的进阶内容吧。

蛇宗三字经(The Zen of Python)

记录一下《蛇宗三字经》,以便自省。

在Python代码中调用C/C++代码

在Python代码中调用C/C++代码,这需求是比较常见的。 毕竟,当代软件世界的基础设施领域是C语言的天下,很多开发工作不可避免地要与它打交道。 而C++则是家族的嫡长子,也占据了一些不可替代的位置。 本文着重介绍ctypes与SWIG,也会提一下其它方案。

Python项目的pytest初始化

pytest,曾用名py.test。 它能兼容unittest与nose的测试代码,写法简洁,并且还有自己的独到之处。 本文仅介绍pytest测试最基本的写法,以及如何在一个Python项目进行初始化。

在AppVeyor上配置Python项目

在GitHub上做CI,大哥是Travis。 不过,Travis只支持Ubuntu和Mac OS X环境。 这就给二哥AppVeyor留下了生存空间,它专门负责做Windows环境的CI,并且对Windows生态下的.NET、Azure等,提供了很好的支持。 本文介绍如何用AppVeyor来做纯Python项目的集成测试。

编译运行SWIG的example代码样例

跑通SWIG的example代码,比Boost.Python的HelloWorld要简单一些。 不过,对不熟悉gcc的人来说,还是很费劲。 本文基于官方教程,补充了一个可行的Makefile。

编译运行Boost.Python的HelloWorld

对于C/C++开发经验不多、或者只有Python经验的人来说,要跑通一个Boost.Python的HelloWord程序,是一件不容易的事。 本文介绍如何避开bjam,用Makefile打通最不容易的那个环节——编译。

setup.py里的几个require

在setup.py中,一般需要要调用setup()函数。 这个函数有诸多参数,其中一类是require,指定了一些需要的Python包。

用GitPython操作Git库

有时,需要做复杂的Git操作,并且有很多中间逻辑。 用Shell做复杂的逻辑运算与流程控制就是一个灾难。 所以,用Python来实现是一个愉快的选择。 这时,就需要在Python中操作Git库。

用Python的minidom写XML

读、或者说解析XML的需求很常见,而写、或者说生成XML的需求就比较少见。 本文简单介绍如何使用minidom,生成一个XML文件。

评估本地PyPI服务

既然已经有了pypi.python.org这个官方源,为什么还需要一个本地源、私有源、企业源? 本文评估了多个PyPI服务的特性与优缺点,并且给出了一些建立本地PyPI服务的建议。

Python中的and与or

从C语言家族,进入Python世界的程序员,当心都被Python中的and与or骗了!

Python中的bool

本文介绍了Python中的bool类型,以及相关的一些概念。

Python中的作用域、global与nonlocal

本文以Python 3来介绍作用域、LEGB规则、global与nonlocal关键字等内容。

Python中神奇的else

Python中的else设计,令人赞叹!

在Docker中使用python-ldap

本文介绍如何在Docker镜像python:alpine中安装python-ldap模块,并且尽量保持镜像的身材。