Làm tool với python

Những “hacker” trên dòng lệnh luôn gõ nhoay nhoáy các “command line” để xử lý text: grep, cut, uniq, sort,… hay đôi khi chơi hẳn sed hoặc AWK, thậm chí Perl5.

Thời xưa, Perl5 vốn là công cụ số một của các SysAdmin, khi mà Python vẫn chưa phổ biến do quá sạch đẹp nhưng cũng hơi “dài dòng” [so với Perl]. Muốn làm gì với Python cũng phải viết ra 1 file, rồi chmod a+x rồi mới chạy được. Perl thì có cả ngàn phép biến hóa chỉ bằng 1 dòng, gọi là one-liner hay trên Wikipedia:

  10 Lý do nên học Python trong năm 2022

  20 tài liệu học Python thiết thực để trở thành lập trình viên chuyên nghiệp

perl -lne 'print if $_ eq reverse' /usr/share/dict/american-english

1 dòng trên để tìm ra các từ “palindrome’ [ngược xuôi như nhau].

Python

Python 1-liner

Python 1-liner vốn không ngắn như mong đợi, do code Python nhấn mạnh vào sự rõ ràng dễ đọc, nên không có các ký tự bí hiểm 

$ python3 -c 'import math; print[math.sqrt[2**1000]]'
3.273390607896142e+150
0 như Perl. Viết Python 1 dòng dùng option 
$ python3 -c 'import math; print[math.sqrt[2**1000]]'
3.273390607896142e+150
1 như sau:

$ python3 -c 'import math; print[math.sqrt[2**1000]]'
3.273390607896142e+150

Các dòng không cần phải xuống dòng mà dùng dấu 

$ python3 -c 'import math; print[math.sqrt[2**1000]]'
3.273390607896142e+150
2 để ngăn cách. Nhưng viết 
$ python3 -c 'import math; print[math.sqrt[2**1000]]'
3.273390607896142e+150
3 hay 
$ python3 -c 'import math; print[math.sqrt[2**1000]]'
3.273390607896142e+150
4 thì … hơi khó.

Python nhiều dòng

Cách này đơn giản hơn, viêt code thành nhiều dòng, ý hệt như code trong file. Dùng dấu single quote 

$ python3 -c 'import math; print[math.sqrt[2**1000]]'
3.273390607896142e+150
5 rồi enter để gõ code, sau đó kết thúc bằng dầu single quote 
$ python3 -c 'import math; print[math.sqrt[2**1000]]'
3.273390607896142e+150
5.

dis Module là disassembler của Python. Nó chuyển đổi byte code thành một định dạng chính xác hơn cho người dùng. Bạn có thể chạy disassembler này từ command line. Nó thông dịch script đã cho và in byte code đã được tách tới STDOUT. Bạn cũng có thể sử dụng nó như là một Module. Hàm dis nhận một lớp, phương thức, hàm hoặc đối tượng code như là tham số đơn của nó. Ví dụ:

Ví dụ

 
import dis

def sum[]:
   vara = 10
   varb = 20

   sum = vara + varb
   print "vara + varb = %d" % sum

# Goi ham dis.

dis.dis[sum]

Kết quả là:

  6           0 LOAD_CONST               1 [10]
              3 STORE_FAST               0 [vara]

  7           6 LOAD_CONST               2 [20]
              9 STORE_FAST               1 [varb]

  9          12 LOAD_FAST                0 [vara]
             15 LOAD_FAST                1 [varb]
             18 BINARY_ADD
             19 STORE_FAST               2 [sum]

 10          22 LOAD_CONST               3 ['vara + varb = %d']
             25 LOAD_FAST                2 [sum]
             28 BINARY_MODULO
             29 PRINT_ITEM
             30 PRINT_NEWLINE
             31 LOAD_CONST               0 [None]
             34 RETURN_VALUE

pdb Module trong Python

pdb Module là Debugger chuẩn của Python. Nó được dựa trên bdb Debugger Framework.

Bạn có thể chạy Debugger này từ command line [gõ n hoặc next để tới dòng tiếp theo và help để lấy danh sách các lệnh có sẵn].

Ví dụ

Trước khi bạn chạy pdb.py, thiết lập path của mình một cách thích hợp tới thư mục Python lib. Sau đó bạn có thể thử ví dụ sum.py trên.

$pdb.py sum.py
> /test/sum.py[3][]
-> import dis
[Pdb] n
> /test/sum.py[5][]
-> def sum[]:
[Pdb] n
>/test/sum.py[14][]
-> dis.dis[sum]
[Pdb] n
  6           0 LOAD_CONST               1 [10]
              3 STORE_FAST               0 [vara]

  7           6 LOAD_CONST               2 [20]
              9 STORE_FAST               1 [varb]

  9          12 LOAD_FAST                0 [vara]
             15 LOAD_FAST                1 [varb]
             18 BINARY_ADD
             19 STORE_FAST               2 [sum]

 10          22 LOAD_CONST               3 ['vara + varb = %d']
             25 LOAD_FAST                2 [sum]
             28 BINARY_MODULO
             29 PRINT_ITEM
             30 PRINT_NEWLINE
             31 LOAD_CONST               0 [None]
             34 RETURN_VALUE
--Return--
> /test/sum.py[14][]->None
-v dis.dis[sum]
[Pdb] n
--Return--
> [1][]->None
[Pdb]

profile Module trong Python

profile Module là Profiler chuẩn của Python. Bạn có thể chạy nó từ command line.

Ví dụ

Chúng ta thử profile chương trình sau:

 

vara = 10
varb = 20

sum = vara + varb
print "vara + varb = %d" % sum

Bây giờ thử chạy cProfile.py thông qua sum.py như sau:

$cProfile.py sum.py
vara + varb = 30
         4 function calls in 0.000 CPU seconds

   Ordered by: standard name

ncalls  tottime  percall  cumtime  percall filename:lineno
   1    0.000    0.000    0.000    0.000 :1[]
   1    0.000    0.000    0.000    0.000 sum.py:3[]
   1    0.000    0.000    0.000    0.000 {execfile}
   1    0.000    0.000    0.000    0.000 {method ......}

tabnanny Module trong Python

tabnanny Module kiểm tra các source file của Python xem có độ thụt dòng nào mơ hồ hay không. Nếu một file mà xóa trộn tab và space, thì tất nhiên là không vấn đề gì với kích cỡ tab bạn đang sử dụng, nhưng tabnanny sẽ đưa ra lời phàn nàn như trong ví dụ sau:

Chủ Đề