1. 枚举类
from enum import Enum
Month = Enum('Month', ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'))
for name, member in Month.__members__.items():
print(name, '=>', member, ',', member.value)
Jan => Month.Jan , 1
Feb => Month.Feb , 2
Mar => Month.Mar , 3
Apr => Month.Apr , 4
May => Month.May , 5
Jun => Month.Jun , 6
Jul => Month.Jul , 7
Aug => Month.Aug , 8
Sep => Month.Sep , 9
Oct => Month.Oct , 10
Nov => Month.Nov , 11
Dec => Month.Dec , 12
value
属性则是自动赋给成员的int
常量,默认从1
开始计数。
我们也可以直接使用Month.Jan
来引用一个常量。
如果需要更精确地控制枚举类型,可以从Enum派生出自定义类:
from enum import Enum, unique
@unique # @unique装饰器可以帮助我们检查保证没有重复值
class Weekday(Enum):
Sun = 0 # Sun的value被设定为0
Mon = 1
Tue = 2
Wed = 3
Thu = 4
Fri = 5
Sat = 6
2. 用于调试的工具们-print(), assert, logging和pdb
2.1 assert(断言)
如:assert n != 0, 'n is zero!'
,assert
的意思是,表达式n != 0
应该是True
,否则,根据程序运行的逻辑,后面的代码肯定会出错。如果断言失败,assert
语句本身就会抛出AssertionError:n is zero!
。他与print()相比的好处是他可以全部关闭,只需在执行的时候添加-o
,这样python解释器会跳过所有的assert
语句:
$ python -O err.py
2.2 logging
import logging
logging.basicConfig(level=logging.INFO)
s = '0'
n = int(s)
logging.info('n = %d' % n)
print(10 / n)
INFO:root:n = 0
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
<ipython-input-4-fb47d4bb0400> in <module>()
5 n = int(s)
6 logging.info('n = %d' % n)
----> 7 print(10 / n)
ZeroDivisionError: division by zero
这就是logging
的好处,它允许你指定记录信息的级别,有debug
,info
,warning
,error
等几个级别,当我们指定level=INFO
时,logging.debug
就不起作用了。同理,指定level=WARNING
后,debug
和info
就不起作用了。这样一来,你可以放心地输出不同级别的信息,也不用删除,最后统一控制输出哪个级别的信息。
logging
的另一个好处是通过简单的配置,一条语句可以同时输出到不同的地方,比如console
和文件。
2.3 pdb
Python的调试器pdb,让程序以单步方式运行,可以随时查看运行状态。输入以下代码进入pdb状态:
$python -m pdb err.py
输入l
:查看代码
输入n
:单步执行代码
输入p 变量名
:查看变量
输入q
:结束调试,退出程序
【设置断点】先导入pdb:import pdb
,在可能出错的地方放一个pdb.set_trace()
,就可以设置一个断点:
# err.py
import pdb
s = '0'
n = int(s)
pdb.set_trace() # 运行到这里会自动暂停
print(10 / n)
运行代码,程序会自动在pdb.set_trace()
暂停并进入pdb调试环境,可以用命令p查看变量,或者用命令c
继续运行: