Đầu vào dòng lệnh python

Gần đây mình có theo dõi các bạn trẻ mới học lập trình làm một số bài tập bằng Python. Các bài tập chủ yếu là các bài đưa ra vấn đề, yêu cầu đầu vào từ dòng lệnh và trong màn hình kết quả

Mọi người sẽ sử dụng hàm input của Python để bắt đầu nhận dữ liệu và sử dụng print để ra màn hình kiểm tra. Cách làm này rất đơn giản và hoàn toàn không sai. Chỉ có điều kiện sử dụng đầu vào trong mã logic sẽ gây ra một tác dụng phụ là khó định hình luồng logic trong mã, do đó làm tăng tính phức tạp của mã

Ảnh minh hoạ

Một trong những nội dung của Unix Philosophy là.
Làm một việc và làm thật tốt

Xử lý đầu vào [IO], thử/bắt lỗi cũng được tính là 1 chuyện, vì vậy nên sử dụng các công cụ một cách thận trọng

Một điều mình muốn nói đến nữa là việc dùn chức năng nhập liệu không phổ biến trong các dự án thực tế. Cho dù chương trình được xây dựng bằng dòng lệnh thì đầu vào sẽ có định dạng. command -p1=v1 -p2=v2 ngay khi chạy chương trình chứ không hiển thị dấu nhắc trong khi chạy chương trình

Việc sử dụng đầu vào trong chức năng sẽ dẫn đến việc không thể hoặc khó [phải giả định] khi thực hiện cụ thể kiểm tra đơn vị 1 chức năng. Kiểm tra đơn vị là công việc phổ biến và vô cùng cần thiết cho việc phát triển phần mềm

Vì một số lý do trên mình đưa ra một ví dụ đầu vào chức năng thay thế bằng các đối số lệnh, cách loại bỏ một chương trình đơn giản là giải phương trình bậc 2 từ dòng lệnh đến kiểm tra đơn vị

Constructor program will be 1 python package menu. Có 1 file chứa mã nguồn, file này khi chạy có thể nhận đối số và 1 file để chạy unit test cho chức năng chính của chương trình. giải_quadratic_equation

quadratic_program
├── __init__.py
├── quadratic.py
└── quadratic_test.py

Tệp __init__. py ở đây là bắt buộc đối với 1 gói python và có thể để trống

Nội dung file bậc hai. py

import argparse
import math
def parse_input[args: dict] -> [float, float, float]:
try:
a = float[args.factor_a]
b = float[args.factor_b]
c = float[args.factor_c]
return [a, b, c]
except ValueError:
raise Exception["Please use integer or float for factors"]
def solve_quadratic_equation[a: float, b: float, c: float] -> list[float, float]:
x1 = None
x2 = None
delta = b ** 2 - 4 * a * c
if delta < 0:
pass
elif delta == 0:
x1 = -b / [2 * a]
x2 = x1
else:
x1 = [-b + math.sqrt[delta]] / [2 * a]
x2 = [-b - math.sqrt[delta]] / [2 * a]
return x1, x2if __name__ == "__main__":
argp = argparse.ArgumentParser[]
argp.add_argument["-a", "--factor_a"]
argp.add_argument["-b", "--factor_b"]
argp.add_argument["-c", "--factor_c"]
[a, b, c] = parse_input[argp.parse_args[]] result = solve_quadratic_equation[a, b, c]
print[result]

File dung. quadratic_test. py

import unittest
from quadratic import solve_quadratic_equation
class TestHandler[unittest.TestCase]:
def test_no_result[self]:
a = 1
b = 2
c = 3
output = solve_quadratic_equation[a, b, c]
eput = [None, None]
self.assertEqual[output, eput]
def test_duplicate_results[self]:
a = 1
b = 2
c = 1
output = solve_quadratic_equation[a, b, c]
eput = [-1, -1]
self.assertEqual[output, eput]
def test_unique_results[self]:
a = 1
b = 2
c = -3
output = solve_quadratic_equation[a, b, c]
eput = [1, -3]
self.assertEqual[output, eput]

Như các bạn đã thấy trong tập bậc hai. py, in this has 2 functions cùng 1 thả diều kiện bên ngoài để nhận đối số khi chạy ở dòng lệnh với cú pháp

quadratic.py -a=1 -b=2 -c=-3

Will for the results

[1.0, -3.0]

Đó là cách chạy ở dạng sản xuất. Nhưng khi viết chương trình thì ngoài việc test bằng tay từng trường hợp, ta có thể chạy unit test để test nhiều trường hợp cùng lúc và hoàn toàn tự động. Ví dụ trong trường hợp trên

$ python3 -m unittest quadratic_test.py
...
----------------------------------------------------------------------

Run test suite kia có 3 cái chấm là 3 test case đã pass tương đương với test 3 trường hợp vô nghiệm, nghiệm kép và 2 nghiệm

Điều quan trọng hơn là nếu 1 phần nào đó trong chương trình cần hàm tính hàm bậc 2 thì chúng ta chỉ việc nhập hàm Solve_quadratic_equation từ tệp bậc hai. py trong gói quadratic_program is done, giải quyết vấn đề chia nhỏ chương trình và tái sử dụng

Chủ Đề