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)相关推荐

  1. pythonic code_Pythonic Code in Practice

    此文章收集平时工作中一些Pythonic code,以供后面参考. 循环结束处理 通常以往的做法是设置一个标志位来处理或其他额外处理: def get_file_content(fpath): &qu ...

  2. pythonic code_pythonic code_Pythonic Code (Part II)

    Iterable Objects 实现可迭代对象的方法有三种:第一种是类内实现 __iter__ 和 __next__ 方法, 第二种是使用 generator, 第三种是封装一个序列.__iter_ ...

  3. pythonic_pythonic方式

    pythonic Python is an object-oriented, as well as the scripting programming language, It is an inter ...

  4. 对quake3源代码的学习与研究初步的计划

    一.大体的文件概要: 1.对.zip文件的IO操作,zlib函数库的IO操作. (zlib是一种函数库,用来压缩和解压缩用的) lines file(s)       4299 code/qcommo ...

  5. 测试你的前端代码 - part3(端到端测试)

    本文作者:Gil Tayar 编译:胡子大哈 翻译原文:http://huziketang.com/blog/posts/detail?postId=58d50da37413fc2e8240855c ...

  6. [开源]quakeIII(雷神之锤3)源码

    来源:http://www.down100.cn/Item/53590.aspx 下载地址:http://www.down100.cn/Common/ShowDownloadUrl.aspx?urli ...

  7. Practice II 字符串

    本来想做数论的--但是别的dalao都在做制胡窜 所以-- Chapter I KMP KMP 最关键的不是这个半暴力的单模匹配 而是这个nxt数组 经常出一些奇怪的题 尤其是循环节可以直接由T-nx ...

  8. kaggle 2018 data science bowl 细胞核分割学习笔记

    一. 获奖者解决方案 1. 第一名解决方案(Unet 0.631) 主要的贡献 targets: 预测touching borders,将问题作为instance分割 loss function:组合 ...

  9. itemarray的意思

    在读取datagridview或datatable某一行的某一列的单元格的值时,可以通过itemarray来获取,可问题是itemarray是一个object类型,设置值没问题,但是获取值就不行.如果 ...

最新文章

  1. sql 密码随机生成
  2. 小工匠聊架构-超高并发秒杀系统设计 04_流量削峰设计
  3. spd耗材管理流程图_国药器械山东公司助力济宁医学院附属医院SPD项目成功启动...
  4. 动态路由协议(RIP)
  5. ajax调用后台java类_ajax调用java后台方法是什么
  6. python羊车门问题_「羊车门」经典概率题中不换门选中车的概率是多少?
  7. java显示星期几_Java 使用日历显示星期几
  8. 面向对象chapter1
  9. 常用adb shell 命令
  10. 又掐起来了!余承东称小米环幕屏手机无实用价值,卢伟冰回怼...
  11. 自定义函数hello,并注册到hive源码中并重新编译
  12. cadence Allegro17.2关闭start page 界面方法
  13. 用Qt实现Q-M算法化简逻辑表达式及Qt项目打包发布方法
  14. strut处理页面请求过程
  15. 用A-priori算法实现frequent item set查找
  16. 驾照科目一速过技巧--2023年
  17. 拯救信息安全行业:微软意欲重写武器控制协定
  18. 大学生闲置物品交易平台UML建模
  19. Spring Security中的密码安全
  20. 笨办法学Python(二十)

热门文章

  1. python标准库模块教程_Python标准库之Sys模块使用详解
  2. 胜利大逃亡 三维BFS
  3. pytorch学习笔记(二十八):循环神经网络的从零开始实现
  4. ~~朴素筛法求素数(附模板题)
  5. 目标检测——Anchor-Based算法的学习笔记
  6. 手机端网页开发的两个重要设置
  7. c/c++教程 - 2.4.1 类和对象,封装,class和struct的区别,成员属性设为私有,类拆分成.h.c文件编写方法
  8. 06 iOS 关闭侧滑返回
  9. 数据库复习 库 表 记录的 增删改查 基础
  10. WebBrowser是IE内置的浏览器控件