包含标签 Python 的文章

关于Dict和OrderDict的插入序

前言 今天刷算法题遇到了LeetCode 146. LRU缓存机制。解这道题的时候需要用到Python的OrderDict的特性——保持元素的插入顺序。 正文 我记得Python3.6开始,Dict已经从以前的随机顺序变为插入序了,而且Guido也明确表示在3.7版本依旧用沿用插入顺序([Python-Dev] Guarantee ordered dict literals in v3.7?) 于是我不禁思考到,那我是不是可以偷个懒不用OrderDict去处理这种问题而直接用Dict。那到底行不行呢?翻文档啊 文档中明确写道: > The order-preserving aspect of this new implementation is considered an implementation detail and should not be relied upon 后话 在Python3.6、3.7版本中Dict的实现细节中实现了元素的插入序,但是这个实现细节在以后可能是会被更改的,所以不能依赖它。并且依赖它可能会造成历史代码不兼容,或者3.8、3.9…后续修改实现细节的版本的代码不兼容,假如工程师忘了这一细节的话出现bug还很难排查。 所以,用到插入序的地方还是用OrderDict吧!……

阅读全文

Pipfile/pipenv替换阿里源

前言 pipenv取代virtualenv的趋势非常明显,所以转到pipenv势在必行。不过pipenv创建的环境中Pipfile文件的源用的是官方源,在国内下载依赖肯定很慢,所以换成阿里源是个不错的选择。 操作 手动执行 python3 -c "from pathlib import Path;fn='Pipfile';Path(fn).write_text(Path(fn).read_text().replace('pypi.org', 'mirrors.aliyun.com/pypi'));Path(fn).write_text(Path(fn).read_text().replace('name = \"pypi\"', 'name = \"aliyun\"'))" 针对PyCharm 每次手动执行命令很麻烦,还不如直接修改Pipfile文件呢。针对PyCharm可以利用其拓展工具来实现一键修改。 步骤 Preferences > Tools > External Tools > 点左下角+号 配置示例 具体配置如下: Program python3 Arguments -c "from pathlib import Path;fn='Pipfile';Path(fn).write_text(Path(fn).read_text().replace('pypi.org', 'mirrors.aliyun.com/pypi'));Path(fn).write_text(Path(fn).read_text().replace('name = \"pypi\"', 'name = \"aliyun\"'))" Working directory $ProjectFileDir$ 后话 至此就配置好了。以后就可以在External Tools点击Pipfile换阿里源来实现一键修改文件。……

阅读全文

使用Docker多步构建来创建Python应用的超小镜像

由来 Multi-stage builds are a new feature in Docker 17.05 官方文档讲述多步构建的示例是一个Go程序,Go程序本身就可以编译成可执行文件,所以使用多步构建很容易。这么好玩的功能必须要用Python实践一下咯。 Demo Demo目录 tornado-multi-stage/ docker-compose.yml Dockerfile requirements.txt run.py requirments.txt:依赖Tornado tornado==4.5.1 run.py:程序入口 程序实现的功能:接收到GET请求后返回Hello World import tornado.ioloop import tornado.web class MainHandler(tornado.web.RequestHandler): def get(self): self.write("Hello World") def make_app(): return tornado.web.Application([ (r"/", MainHandler), ]) if __name__ == "__main__": app = make_app() app.listen(8888, '0.0.0.0') tornado.ioloop.IOLoop.current().start() docker-compose.yml 没做什么特别的事情,就做了一下端口映射 version: "3" services: web: build: . ports: - 8888:8888 Dockerfile:重点 FROM python:3.……

阅读全文