pythonic code_Pythonic Code (Part III)
Summary of magic method
下面列表是目前所提到的所有魔术方法的汇总。
Caveats in Python
Mutable default arguments
看下面的例子
def wrong_user_input(user_data: dict = {'name': 'yuri', 'age': 23}):
name = user_data.pop('name')
age = user_data.pop('age')
return f"{name}({age})"
执行结果
>>> wrong_user_input()
'yuri (23)'
>>> wrong_user_input({'name': 'jerry', 'age': 15})
'jerry (15)'
>>> wrong_user_input()
Traceback (most recent call last):
File "", line 1, in
File "testinput.py", line 10, in wrong_user_input
name = user_data.pop('name')
KeyError: 'name'
可以看到如果使用可变变量作为函数默认参数,那么就会出现上述情况。调用几次之后会发现默认参数被修改到面目全非。
这时候可以修改如下:
def correct_user_input(user_data: dict = None):
user_data = user_data or {'name': 'yuri', 'age': 23}
name = user_data.pop('name')
age = user_data.pop('age')
return f"{name}({age})"
执行结果
>>> correct_user_input()
'yuri (23)'
>>> correct_user_input({'name': 'jerry', 'age': 15})
'jerry (15)'
>>> correct_user_input()
'yuri (23)'
可以看到无论怎么调用,函数都不会出错。
Extending built-in type
扩展内置类型的正确做法是使用 collections 模块里面的带 User 开头的类。比如, 想要扩展 List,就可以使用 UserList,再比如想要扩展 Dict,就可以使用 UserDict。看下面的例子:
class BadDict(dict):
"""docstring for MyDict"""
def __getitem__(self, key):
value = super().__getitem__(key)
if value % 2 == 0:
prefix = "even"
else:
prefix = "odd"
return f"{key}:{prefix}({value})"
执行结果
>>> bd = BadDict({"one": 2, "two": 5})
>>> bd['one']
'one: even(2)'
>>> [item for item in bd.items()]
[('one', 2), ('two', 5)]
>>>
可以看到,当执行循环的时候字典的值并不是所预期的加上 prefix。
虽然在其他编译器可能不会出现这种情况,比如 Pypy,但是最好是能写出适配所有情况的代码,修改如下:
class GoodDict(UserDict):
"""docstring for MyDict"""
def __getitem__(self, key):
value = super().__getitem__(key)
if value % 2 == 0:
prefix = "even"
else:
prefix = "odd"
return f"{key}: {prefix}({value})"
这次我们改用 UserDict 类,执行结果如下:
>>> gd = GoodDict({"one": 2, "two": 5})
>>> gd['one']
'one: even(2)'
>>> [item for item in gd.items()]
[('one', 'one: even(2)'), ('two', 'two: odd(5)')]
可以见到,一切如预期。
pythonic code_Pythonic Code (Part III)相关推荐
- pythonic code_Pythonic Code in Practice
此文章收集平时工作中一些Pythonic code,以供后面参考. 循环结束处理 通常以往的做法是设置一个标志位来处理或其他额外处理: def get_file_content(fpath): &qu ...
- pythonic code_pythonic code_Pythonic Code (Part II)
Iterable Objects 实现可迭代对象的方法有三种:第一种是类内实现 __iter__ 和 __next__ 方法, 第二种是使用 generator, 第三种是封装一个序列.__iter_ ...
- pythonic_pythonic方式
pythonic Python is an object-oriented, as well as the scripting programming language, It is an inter ...
- 对quake3源代码的学习与研究初步的计划
一.大体的文件概要: 1.对.zip文件的IO操作,zlib函数库的IO操作. (zlib是一种函数库,用来压缩和解压缩用的) lines file(s) 4299 code/qcommo ...
- 测试你的前端代码 - part3(端到端测试)
本文作者:Gil Tayar 编译:胡子大哈 翻译原文:http://huziketang.com/blog/posts/detail?postId=58d50da37413fc2e8240855c ...
- [开源]quakeIII(雷神之锤3)源码
来源:http://www.down100.cn/Item/53590.aspx 下载地址:http://www.down100.cn/Common/ShowDownloadUrl.aspx?urli ...
- Practice II 字符串
本来想做数论的--但是别的dalao都在做制胡窜 所以-- Chapter I KMP KMP 最关键的不是这个半暴力的单模匹配 而是这个nxt数组 经常出一些奇怪的题 尤其是循环节可以直接由T-nx ...
- kaggle 2018 data science bowl 细胞核分割学习笔记
一. 获奖者解决方案 1. 第一名解决方案(Unet 0.631) 主要的贡献 targets: 预测touching borders,将问题作为instance分割 loss function:组合 ...
- itemarray的意思
在读取datagridview或datatable某一行的某一列的单元格的值时,可以通过itemarray来获取,可问题是itemarray是一个object类型,设置值没问题,但是获取值就不行.如果 ...
最新文章
- sql 密码随机生成
- 小工匠聊架构-超高并发秒杀系统设计 04_流量削峰设计
- spd耗材管理流程图_国药器械山东公司助力济宁医学院附属医院SPD项目成功启动...
- 动态路由协议(RIP)
- ajax调用后台java类_ajax调用java后台方法是什么
- python羊车门问题_「羊车门」经典概率题中不换门选中车的概率是多少?
- java显示星期几_Java 使用日历显示星期几
- 面向对象chapter1
- 常用adb shell 命令
- 又掐起来了!余承东称小米环幕屏手机无实用价值,卢伟冰回怼...
- 自定义函数hello,并注册到hive源码中并重新编译
- cadence Allegro17.2关闭start page 界面方法
- 用Qt实现Q-M算法化简逻辑表达式及Qt项目打包发布方法
- strut处理页面请求过程
- 用A-priori算法实现frequent item set查找
- 驾照科目一速过技巧--2023年
- 拯救信息安全行业:微软意欲重写武器控制协定
- 大学生闲置物品交易平台UML建模
- Spring Security中的密码安全
- 笨办法学Python(二十)
热门文章
- python标准库模块教程_Python标准库之Sys模块使用详解
- 胜利大逃亡 三维BFS
- pytorch学习笔记(二十八):循环神经网络的从零开始实现
- ~~朴素筛法求素数(附模板题)
- 目标检测——Anchor-Based算法的学习笔记
- 手机端网页开发的两个重要设置
- c/c++教程 - 2.4.1 类和对象,封装,class和struct的区别,成员属性设为私有,类拆分成.h.c文件编写方法
- 06 iOS 关闭侧滑返回
- 数据库复习 库 表 记录的 增删改查 基础
- WebBrowser是IE内置的浏览器控件