0%

Useful Tips for Python Programming

最近實在是太頹廢了,強迫自己寫些新東西
蟒蛇有些新玩具,可以加入自己的工具組合之中

PySnooper

Github Project主業
首先先安裝pysnooper這個package

1
$ pip install pysnooper

然後來個最簡單的示範,寫個比官方範例更複雜一點

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@pysnooper.snoop()
def findPrimes(number):
num = 2
primes = []
while num <= number:
div = 2
flag = True
while div * div <= num and flag:
if num % div == 0:
flag = False
div = div + 1
if flag:
primes.insert(len(primes), num)
num = num + 1
return primes
print(findPrimes(10))

然後可以列出所有中間產物的過程

輸出到Log file

可以指定到不同的Log file

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import pysnooper

@pysnooper.snoop("./debug1.log")
def isPrime(num):
div = 2
while div * div <= num:
if num % div == 0:
return False
div = div + 1
return True

@pysnooper.snoop("./debug.log")
def findPrimes(number):
num = 2
primes = []
while num <= number:
if isPrime(num):
primes.insert(len(primes), num)
num = num + 1
return primes
print(findPrimes(10))

用不同的Prefix區分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import pysnooper

@pysnooper.snoop("./debug.log", prefix="--isPrime--")
def isPrime(num):
div = 2
while div * div <= num:
if num % div == 0:
return False
div = div + 1
return True

@pysnooper.snoop("./debug.log", prefix="--findPrimes--")
def findPrimes(number):
num = 2
primes = []
while num <= number:
if isPrime(num):
primes.insert(len(primes), num)
num = num + 1
return primes
print(findPrimes(10))

stackprinter

Github Project主業
要做的還是先裝上去

1
$ pip install stackprinter

接著我們修改上面的範例,讓它Crash

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def isPrime(num):
div = 0
while div * div <= num:
if num % div == 0:
return False
div = div + 1
return True

def findPrimes(number):
num = 2
primes = []
while num <= number:
if isPrime(num):
primes.insert(len(primes), num)
num = num + 1
return primes
print(findPrimes(10))

執行之後產生以下的 Crash info

1
2
3
4
5
6
7
8
Traceback (most recent call last):
File "a.py", line 20, in <module>
print(findPrimes(10))
File "a.py", line 16, in findPrimes
if isPrime(num):
File "a.py", line 7, in isPrime
if num % div == 0:
ZeroDivisionError: integer division or modulo by zero

如果我們加上了stachpointer

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import stackprinter
stackprinter.set_excepthook(style='darkbg2')

def isPrime(num):
div = 0
while div * div <= num:
if num % div == 0:
return False
div = div + 1
return True

def findPrimes(number):
num = 2
primes = []
while num <= number:
if isPrime(num):
primes.insert(len(primes), num)
num = num + 1
return primes
print(findPrimes(10))

會變成這樣子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
File a.py, line 20, in <module>
16 if isPrime(num):
17 primes.insert(len(primes), num)
18 num = num + 1
19 return primes
--> 20 print(findPrimes(10))

File a.py, line 16, in findPrimes
12 def findPrimes(number):
13 num = 2
14 primes = []
15 while num <= number:
--> 16 if isPrime(num):
17 primes.insert(len(primes), num)
..................................................
number = 10
num = 2
primes = []
..................................................

File a.py, line 7, in isPrime
4 def isPrime(num):
5 div = 0
6 while div * div <= num:
--> 7 if num % div == 0:
8 return False
..................................................
num = 2
div = 0
..................................................

ZeroDivisionError: integer division or modulo by zero

有顏色和箭頭比較容易分析哪裡出錯