Python代码整洁之道勘误

2023-05-16

  • 简介:

本博文是对<Python代码整洁之道>一书的一些错误进行矫正.
这本书英文名字是<Clean Python Elegant Coding int Python>
这本书的作者是Sunil Kapil. 这本书错误非常多, 真的是非常非常多

  • ps:

我由于没有更多的精力来阅读全本的英文版本,所以可能有些地方的错误需要大家
补充

p6

代码清单1-10 以函数形式对字典排序

def get_sorted_dictionary(users):
    """Sort the nested dictionary"""
    if not isinstance(users, dict):
        raise ValueError("Not a correct dictionary")
    if not len(users):
        raise ValueError("Empty dictionary")
    users_by_name = sorted(users, key=get_user_name)
    return users_by_name

这里的users此时是list实例, 所以应该是isinstance(users, list)


p7

代码清单1-12 以更具可读性的代码读取一个csv文件

import csv
with open('employee.txt', mode='r') as csv_file:
 	csv_reader = csv.DictReader(csv_file)
	line_count = 0
 	process_salary(csv_reader)

这里是一个employee.txt的example, 可以写入后改为csv文件
第一行第表头columns,其余行是表信息

name,country,age,salary
clarence,US,23,20k
bob,Canada,29,40k
ruby,Japan,28,16k

这里打开文件应该是employee.csv文件, 原著作者应该是创建并写入employee.txt然后修改后缀名为csv, 所以写代码的时候忽略了


p11

7 比较类型时更偏向使用isintance()方法而不是type()

user_ages = {"Larry": 35, "Jon": 89, "Imli": 12}
type(user_ages) == dict

这里最好是type(user_ages) is dict


p22

1.3.2 不要使用复杂的列表推导

ages = [1, 34, 5, 7, 3, 57, 356]
old = [age for age in ages if 10 < age < 100 and age is
not None]

如果要校验,那么写在and逻辑运算符前面,注意短路


p23

1.3.3 应该使用lambda吗
关于函数功能描述有误(原版和译版)
这里如果是找到列表中含有最小值的元素,应该这样

def min_val(data):
	"""Find minimum value from the data list."""
	return min(data, key=lambda x:len(x))

改为return min(data, key=lambda x: min(x))


p27

1.3.6 为什么range函数在Python3中更好
译者翻译有误

原文是:

If you have worked with Python 2, you might have used xrange. In Python 3,
xrange has been renamed to range with some extra features. range is
similar to xrange and generate an iterable.

译文里range类似于xrange并生成一个迭代器

应该是range与xrange相似, 并且产生一个可迭代对象, 这也许会对初中级的python使用者产生困扰.


p32

1.4.4 只处理特定的异常
如下是译者自己附加的解释, 但except Exception:并不是处理所有异常

(except: 或者except Exception将处理所有的异常, 它会导致代码隐藏不想隐藏的关键错误
或异常.)
  • 官方文档如下关于exception Exception的描述
exception Exception
All built-in, non-system-exiting exceptions are derived from this 
class. 
All user-defined exceptions should also be derived from this class.
  • 异常结构图
BaseException
 +-- SystemExit
 +-- KeyboardInterrupt
 +-- GeneratorExit
 +-- Exception
      +-- StopIteration
      +-- StopAsyncIteration
      +-- ArithmeticError
      |    +-- FloatingPointError
      |    +-- OverflowError
      |    +-- ZeroDivisionError
      +-- AssertionError
      +-- AttributeError
      +-- BufferError
      +-- EOFError
      +-- ImportError
      |    +-- ModuleNotFoundError
      +-- LookupError
      |    +-- IndexError
      |    +-- KeyError
      +-- MemoryError
      +-- NameError
      |    +-- UnboundLocalError
      +-- OSError
      |    +-- BlockingIOError
      |    +-- ChildProcessError
      |    +-- ConnectionError
      |    |    +-- BrokenPipeError
      |    |    +-- ConnectionAbortedError
      |    |    +-- ConnectionRefusedError
      |    |    +-- ConnectionResetError
      |    +-- FileExistsError
      |    +-- FileNotFoundError
      |    +-- InterruptedError
      |    +-- IsADirectoryError
      |    +-- NotADirectoryError
      |    +-- PermissionError
      |    +-- ProcessLookupError
      |    +-- TimeoutError
      +-- ReferenceError
      +-- RuntimeError
      |    +-- NotImplementedError
      |    +-- RecursionError
      +-- SyntaxError
      |    +-- IndentationError
      |         +-- TabError
      +-- SystemError
      +-- TypeError
      +-- ValueError
      |    +-- UnicodeError
      |         +-- UnicodeDecodeError
      |         +-- UnicodeEncodeError
      |         +-- UnicodeTranslateError
      +-- Warning
           +-- DeprecationWarning
           +-- PendingDeprecationWarning
           +-- RuntimeWarning
           +-- SyntaxWarning
           +-- UserWarning
           +-- FutureWarning
           +-- ImportWarning
           +-- UnicodeWarning
           +-- BytesWarning
           +-- EncodingWarning
           +-- ResourceWarning

except Exception:捕获所有的非系统退出异常, 除此之外还有系统退出、键盘中断、生成器退出异常
except: 捕获所有类型的异常


p33

1.4.4 只处理特定的异常
这里描述错误, 应该是Get list of even numbers from given list

def get_even_list(num_list):
    """Get list of odd numbers from given list."""
    # This can raise NoneType or TypeError exceptions
    return [item for item in num_list if item%2==0]

p39

2.1.1 使用集合
集合是无序不重复元素, 不支持索引、切片以及任何序列行为
序列是字符串、列表和元组,集合不是序列

如下是原文和译文

原文:
They don’t allow duplicates.
• You can’t access set elements using an index.
• Sets can access elements in O(1) time since they use
hashtables.
• Sets don’t allow some common operations that lists do
like slicing and lookups.
• Sets can sort the elements at insertion time.
译文:
• 集合元素不能重复
• 不支持索引访问集合里的元素
译者翻译错误,集合底层就是散列表,而不是使用散列表
• 集合使用散列表之后,可以在O(1)时间内访问元素 
译者翻译错误,"纠正"了原文,很遗憾,也是错误的,集合不支持,原文是正确的
• 集合支持一些常见的操作,如列表的切片和查询
集合是无序的,这条是不成立的
• 集合可以在插入元素时对元素进行排序

p39

代码清单2-1 使用集合访问数据
译者对于描述信息出现了"直译"
正确为该项在内存中的位置的因素之一是对象的哈希值

原文:
Sets are implemented using hashtables, so whenever a new item is
added to a set, the positioning of the item in memory is determined by
the hash of the object.
译文:
集合是使用散列表实现的,因此每当一个新项添加到集合中时, 该项在内存中的
位置由散列的对象确定.

p39

代码清单2-2 使用集合去重
描述错误集合

原文:
集合可用作字典的键, 也可以使用集合用作其他数据结构的键, 如列表(list)

集合是可变的, 不可哈希,不能用于字典的键

In [1]: l = {1, 2, 3}
In [2]: l.__hash__ is None
Out[2]: True
In [3]: getattr(l, "__hash__") is None
Out[3]: True
In [4]: callable(l.__hash__)
Out[4]: False
In [5]: hash(l)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Input In [5], in <cell line: 1>()
----> 1 hash(l)
TypeError: unhashable type: 'set'

p45

代码清单2-9 使用列表返回素数
代码错误, 多出来一行
正确示例如下

#!usr/bin/python
# -*- coding:utf8 -*-
def get_prime_numbers(lower, higher):
    primes = []
    for num in range(lower, higher + 1):
        is_prime = True
        for item in range(2, int(num ** 0.5) + 1):
            if num % item == 0:
                is_prime = False
                break
        if is_prime:
            primes.append(num)
    return primes


if __name__ == '__main__':
    print(get_prime_numbers(1, 7))

p45

代码清单2-10 对素数使用生成器
is_prime函数比较奇怪,修改后如下

#!usr/bin/python
# -*- coding:utf8 -*-
import math


def is_prime(num):
    for item in range(2, int(math.sqrt(num)) + 1):
        if num % item == 0:
            return False 

    return True

p48

2.1.6 使用Python的内置函数
译者对于csv模块描述信息出现了"直译"

正确译文
csv
Use csv for reading and writing CSV files. It will save you lot of time instead
of writing your own methods while reading files.
csv模块用于读写csv文件. 它能帮助你读写时节省大量的时间,你不需要重复造轮子

p50

代码清单2-15 使用__future__

from __future__ import division

p54

2.2.3 有序字典、默认字典、普通字典
对于描述部分有"直译"

As of Python 3.6, dicts are now ordered by insertion order, which
actually reduces the usefulness of ordereddict
python3.6之后(包含), 字典根据插入顺序排序, 所以ordereddict自然就基本上没有
用武之地了,除非要兼容

p64

代码清单3-5 引发一个异常而不是None
正确代码如下

#!usr/bin/python
# *- coding:utf8 -*-
def read_lines_for_python(file_name, file_type):
    if file_type not in ("txt", "html"):
        raise ValueError("Not correct file format")
    if not file_name:
        raise IOError("File Not Found")
    filename = "".join([file_name, ".", file_type])
    with open(filename, "r") as fileread:
        for line in fileread:
            if "python" in line:
                return "Found Python"


if __name__ == '__main__':
    if not read_lines_for_python("file_without_python_name", "pdf"):
        print("Python keyword doesn't exists in file")

p66

代码清单3-11 显示地返回None
译文出现"直译"

正确译文如下
Here you expect the result to be a value in the sum function, which is
misleading because it could return None or a sum of two numbers. So, you
always need to check the result for None, which is too much noise in the
code and makes the code more complex over time
你期望sum函数返回的是一个值, 如果返回None或者两数之和会是一种误导
在这种情况下,你需要不断的检查sum的返回结果是否为None. 代码会随着时间变得
混乱和复杂

p67

代码清单3-13 显示地返回None
代码清单3-14 不显示地返回None
原文判断numbers是list及其子类的实例逻辑错误
对于函数功能描述错误
正确如下

def find_odd_number(numbers):
    odd_numbers = []
    if not isinstance(numbers, list):
        return None
    for item in numbers:
        if item % 2 != 0:
            odd_numbers.append(item)
    return odd_numbers

num = find_odd_number([2, 4, 6, 7, 8, 10]) # return 7
num = find_odd_number((2, 4, 6, 7, 8, 10)) # return None
num = find_odd_number([2, 4, 6, 8, 10]) # return []
"""
This function by default returns None if it does not find an odd
number. The function also returns None if the type of numbers is not a list.
如果numbers的类型不是list,那么返回的是[]空列表,不是None
"""

p68

3.1.5 编写函数时注意防御
代码清单3-15 Python中的日志记录
代码清单中代码有好几处错误,正确如下所示

#!usr/bin/python
# *- coding:utf8 -*-
import os
import logging
from logging import StreamHandler


current_filename = os.path.basename(__file__)
logger = logging.getLogger(current_filename)
handler = StreamHandler()
handler.setLevel(logging.WARNING)
format_c = logging.Formatter("%(name)s---%(levelname)s---%(message)s")
handler.setFormatter(format_c)
logger.addHandler(handler)


def division(divident, divisor):
    try:
        return divident/divisor
    except ZeroDivisionError:
        logger.error("Zero Division Error")


if __name__ == '__main__':
    num = division(4, 0)
# 错误结果如下
# filename.py---ERROR---Zero Division Error
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python代码整洁之道勘误 的相关文章

  • 来自 python 的 FQL 多重查询因 unicode 查询而失败

    使用 python 2 6 5 和 facebook sdk 0 3 2 import facebook api facebook GraphAPI token api fql example u SELECT uid2 FROM frie
  • Python的unpack中的逗号是什么意思?

    我们可以简单地使用 crc struct unpack gt i data 为什么人们这样写 crc struct unpack gt i data 逗号是什么意思 第一个变体返回一个单元素元组 In 13 crc struct unpac
  • Python 将列表中的字符串转换为数字

    我遇到了以下错误消息 以 10 为基数的 int 的文字无效 2 2 外部用单引号括起来 内部用双引号括起来 该数据位于primes列出使用print primes 0 样本数据在primes list 2 3 5 7 The primes
  • Python - 包和设置文件

    我有一个 python 包 需要从我的项目目录中提取设置 这是我的项目当前的结构 Project bin mypackage package files Project myproject project files start py se
  • WTForms 中的小数字段舍入

    我有一个包含价格小数字段的表单 如下所示 from flask ext wtf import Form import wtforms from wtforms validators import DataRequired from deci
  • 字母表中的加密和解密 - Python GCSE

    我目前正在尝试为学校编写一个程序 以便加密和解密输入的消息 我需要加密或解密的消息仅在字母表中 没有其他符号或密钥 例如 使用消息车加密输入的偏移量为 5 我希望它输出 afs 有人可以帮忙吗 这是我目前的代码 def find offse
  • 按字段名称对命名元组列表进行排序的 Pythonic 方法

    我想对命名元组列表进行排序 而不必记住字段名的索引 我的解决方案看起来相当尴尬 希望有人能有一个更优雅的解决方案 from operator import itemgetter from collections import namedtu
  • 在 Ubuntu 上使用 Python 获取显示器分辨率

    对于 Ubuntu win32api 中是否有与 GetSystemMetrics 相当的代码 我需要获取显示器的宽度和高度 以像素为单位 我可以建议一些可以使用的方法 不过我还没有使用过 xlib 版本 1 xlib Python 程序的
  • Python argparse store_true 并将可选选项存储在一个参数中[重复]

    这个问题在这里已经有答案了 我需要识别是否单独给出参数或带有可选字符串或两者都没有 parser add argument options parser parse args so prog py arg 应该存储 进入选项 arg pro
  • 如何抑制 pyinstaller 生成的可执行文件窗口中的所有警告

    我已经使用 pyinstaller 从 python 文件生成了可执行文件 该程序按其应有的方式工作 但在我想隐藏的窗口中出现了一条警告消息 当 python 文件在 IDE 中运行时 以下行会抑制所有警告消息 warnings filte
  • 不重复的Python组合

    我有一个数字列表 我想从中进行组合 如果我有清单 t 2 2 2 2 4 c list itertools combinations t 4 结果是 2 2 2 2 2 2 2 4 2 2 2 4 2 2 2 4 2 2 2 4 但我想得到
  • 如何在树莓派上更新到最新的 python 3.5.1 版本?

    我昨天拿到了 Raspberry Pi 我已经在尝试用它来编写代码了 我有一个计划在其上运行的程序 但它仅与 Python 版本 3 5 0 或 3 5 1 兼容 并且我在互联网上找到的所有内容似乎都已经过时 与 Python 2 有关 或
  • 如何将时间间隔划分为不同长度的部分?

    我有一个从 0 到t 我想把这个区间分成一个以2 25 2 25 1 5为周期的累积序列 方法如下 input start 0 stop 19 output sequence 0 2 25 4 5 6 8 25 10 5 12 14 25
  • Beautiful Soup 获取动态表数据

    我有以下代码 url https www basketball reference com leagues NBA 2017 standings html all expanded standings html urlopen url so
  • 从 sublime_plugin.WindowCommand 获取当前文件名

    我开发插件sublime text 3 并想要获取当前打开的文件路径 absolute1 self window view file name 在哪里self is sublime plugin WindowCommand 但失败了 Att
  • 安排 Asyncio 任务每 X 秒执行一次?

    我正在尝试创建一个 python 不和谐机器人 它将每隔 X 秒检查一次活跃会员 并根据会员的在线时间奖励积分 我正在使用 asyncio 来处理聊天命令 这一切都正常 我的问题是找到一种方法来安排每隔 X 秒异步检查一次活动成员 我已经阅
  • 使用 Pandas 和 Group By 绘制堆叠直方图

    我正在使用如下所示的数据集 Gender Height Width Male 23 4 4 4 Female 45 4 4 5 我想可视化高度和宽度的堆叠直方图 我希望每个图有两个堆叠的直方图 每个性别一个 这是文档中的堆叠直方图 如果存在
  • 用于桌面数据库应用程序的 Python 框架

    是否有一个框架可以为Python开发桌面数据库应用程序 一些带有CRUD屏幕的屏幕 我正在寻找类似于 Windows 窗体的东西 能够将 TextField Combos 和其他 UI 隐喻与datasets连接到关系数据库例如 MySQL
  • 将 pandas 数据框中的多列更改为日期时间

    我有一个 13 列和 55 000 行的数据框 我正在尝试将其中 5 行转换为日期时间 现在它们返回类型 对象 我需要转换这些数据以进行机器学习 我知道如果我这样做 data birth date pd to datetime data b
  • PyQt QFileDialog exec_ 很慢

    我正在使用自定义QFileDialog因为我想选择多个目录 但是exec 功能非常慢 我不明白为什么 我正在使用最新版本的 PyQt 代码片段 from PyQt4 import QtGui QtCore QtNetwork uic cla

随机推荐

  • 顶级程序员都在用哪些网站?

    前言 在这里给大家分享一点非常高质量的学习资料和工具网站 欢迎大家留下精彩的网站 xff0c 也可以是生活的 商业的等等 目录 高质量免费在线书籍高质量算法网站开源社区网站在线工具源码查找容器化技术 还有很多 将不定期更新 高质量免费在线书
  • ❤️Python是一个业余的编程语言吗?❤️

    x1f47e 前言 作为一个在python国内还很小众的时候就开始玩Python了 我知道有大佬是2013年就玩的很溜了 xff0c 麻烦让我装个逼 不过Python正渐渐退出了我的主力语言 xff0c golang c rust可能是未来
  • 一文讲清SSL协议

    OSI七层模型 计算机网络的OSI七层模型和TCP IP四层模型想必大家都知道 其中SSL TLS是一种介与于传输层 xff08 比如TCP IP xff09 和应用层 xff08 比如HTTP xff09 的协议 它通过 34 握手协议
  • 闭包详解(Python为例)

    不能简单讲 xff0c 这就要看一些底层的东西 堆栈结构等等 xff0c 估计还和编译原理有关 xff0c 我觉得重点在于延迟绑定怎么知道绑定的外层函数的局部变量 python的闭包是延迟绑定 什么是闭包 出现函数嵌套 即外层函数嵌套内层函
  • c++中函数只声明,不定义(不调用该函数)可以通过编译并运行

    c 43 43 中函数只声明 xff0c 不定义 xff0c 代码中也没有该函数的调用 xff0c 可以编译并运行 xff08 vs2015 xff09 Author gtkiller Date 2018 03 19 include lt
  • RMI的基础原理

    背景 上世纪90年代 焦点转移到跨平台通信 一台计算机可以通过某种类型网络在另一台计算机上发起一个动作 CORBA DCOM Java RMI 技术等等 xff0c 到现在的grpc等 Hello span class token keyw
  • 一次因修改Python编码规范而引起的“血案“

    简单来说就是因为如下代码 导致了ZipOutputPath的一个函数异常 导致zip包不能正确下载 有如下报错 UnboundLocalError local variable 39 val 39 referenced before ass
  • Python之禅(The Zen of Python)源码分析

    简介 非常高兴大家能够订阅这个专栏 在这里我将会给大家分享一些Python相关源码的剖析 在接下来的这段日子里 我会一同带各位pythonista探索Python的奥秘 该从什么开始 思来想去 我觉得作为一个Python初学者还是Pytho
  • Linux常用命令速查表

    目录即文件 dev null 等价于只写文件 所有写入它的内容都会永远丢失 而尝试从它那儿读取内容则什么也读不到 禁止标准输出 cat filename gt dev null 文件内容丢失 xff0c 而不会输出到标准输出 禁止标准错误
  • git常用命令速查表

    这是一些比较常用的命令 大家可以复制后用typora做成pdf格式 xff0c 方便快速查询 后续不定期更新 官方文档 官方文档 https git scm com docs 本地文档 file D cmder vendor git for
  • python开发中的常用命令

    这是一些比较常用的命令 大家可以复制后用typora做成pdf格式 xff0c 方便快速查询 后续不定期更新 pip升级 pip package installer for python use pip to install package
  • Python手写一个Base64编解码工具

    这里我们只实现标准的base64 补充位用 61 填充 编码 下面是base64字符的对照表 因为base64编码是将6bit表示成8bit 所以在原来的基础上会增长1 3 另外2 6 61 64 xff0c 这也是为什么这个表会有64个索
  • Python彩蛋源码分析(二)

    简介 非常高兴大家能够订阅这个专栏 在这里我将会给大家分享一些Python相关源码的剖析 在接下来的这段日子里 我会一同带各位pythonista探索Python的奥秘 hello world hello world hello pytho
  • Python源码剖析专栏总览

    简介 非常高兴大家能够订阅这个专栏 在这里我将会给大家分享一些Python相关源码的剖析 在接下来的这段日子里 我会一同带各位pythonista探索Python的奥秘 将会分析一些源码的构思设计以及这些工具的使用方法 彩蛋篇 Easter
  • maven笔记小抄

    settings xml settings xml位置 标签指定本地下载的依赖在本地的保存位置 user home m2 repository表示C Users username m2 settings xml idea中File Sett
  • linux 下 tcpdump 详解 后篇(自己实现抓包过滤)

    一 概述 在了解了tcpdump的原理后 xff0c 你有没有想过自己去实现抓包过滤 xff1f 可能你脑子里有个大概的思路 xff0c 但是知道了理论知识 xff0c 其实并不能代表你完全的理解 只要运用后 xff0c 你才知道哪些点需要
  • Python字节码分析(一)

    简介 非常高兴大家能够订阅这个专栏 在这里我将会给大家分享一些Python相关源码的剖析 在接下来的这段日子里 我会一同带各位pythonista探索Python的奥秘 Pyc文件 简介 当在文件被当成模块导入时才会生成pyc文件 pyc文
  • Python基本类型(一)

    简介 非常高兴大家能够订阅这个专栏 在这里我将会给大家分享一些Python相关源码的剖析 在接下来的这段日子里 我会一同带各位pythonista探索Python的奥秘 basic data types in python Python中的
  • xmlrpc源码解读(一)

    简介 非常高兴大家能够订阅这个专栏 在这里我将会给大家分享一些Python相关源码的剖析 在接下来的这段日子里 我会一同带各位pythonista探索Python的奥秘 将会分析一些源码的构思设计以及这些工具的使用方法 一个简单的RPC实例
  • Python代码整洁之道勘误

    简介 本博文是对 lt Python代码整洁之道 gt 一书的一些错误进行矫正 这本书英文名字是 lt Clean Python Elegant Coding int Python gt 这本书的作者是Sunil Kapil 这本书错误非常