Trăn vá khỉ
Bản vá khỉ là kỹ thuật sửa đổi động một đoạn mã trong thời gian chạy. Trên thực tế, bằng cách thực hiện bản vá khỉ, chúng tôi thay đổi hành vi của mã nhưng không ảnh hưởng đến mã nguồn ban đầu Show
Môn lịch sửBản vá khỉ xuất phát từ bản vá du kích, du kích gần như có nghĩa là khỉ đột có thể xác định loài khỉ. Bản vá du kích đề cập đến sự thay đổi lén lút. Nhưng money patch có vẻ dễ phát âm nên bây giờ nó được gọi là “ Monkey patch“. Trong từ “Monkey-patch” từ khỉ định nghĩa từ động Khỉ vá trong trănBản vá khỉ trong python đề cập đến việc sửa đổi hoặc cập nhật một đoạn mã hoặc lớp hoặc bất kỳ mô-đun nào trong thời gian chạy. Nói một cách đơn giản, chúng ta có thể thay đổi hành vi hoặc hoạt động của một lớp/mô-đun trong thời gian chạy mà không cần thay đổi toàn bộ mã python. Nhưng đôi khi việc vá lỗi khỉ được coi là thực hành không tốt vì định nghĩa của đối tượng không mô tả chính xác cách đối tượng hoạt động trong mã Hiển thị tham chiếu API Monkeyrunner theo kiểu tương tự như công cụ 03 của Python, sử dụng định dạng được định dạng duy nhấtchuỗi (chuỗi thông báo, chuỗi initialValue, chuỗi tiêu đề [tiêu_đề], chuỗi okTitle, chuỗi HủyTitle)Hiển thị hộp thoại chấp nhận dữ liệu đầu vào khoảng trống (no seconds)Stopped program program at in some seconds only 04 (thời gian chờ nổi, chuỗi deviceid)Cố gắng kết nối giữa phần phụ trợ 05 và mô phỏng hoặc thiết bị đã định sẵnPhương thức công khaichuỗi cảnh báo (chuỗi thông báo, chuỗi tiêu đề, chuỗi okTitle)Hiển thị hộp thoại cảnh báo quy trình đang chạy chương trình hiện tại. Hộp thoại đã ở chế độ nên chương trình sẽ tạm dừng cho đến khi người dùng nhấp vào nút của hộp thoại Argumentthông báoNội dung hiển thị trong hộp thoại. tiêu đềTiêu đề của hộp thoại. Default value is "Cảnh báo". okTitleVăn bản hiển thị trong nút hộp thoại. default value is "OK"số nguyên lựa chọn (chuỗi thông báo, lựa chọn có thể lặp lại, chuỗi tiêu đề)Hiển thị hộp thoại có danh sách các lựa chọn cho quy trình chạy chương trình hiện tại. Hộp thoại đã ở chế độ nên chương trình sẽ tạm dừng cho đến khi người dùng nhấp vào một trong các nút trên hộp thoại Argumentthông báoThông báo nhắc xuất hiện trong hộp thoại. lựa chọnMột lỗi Python có thể lặp lại chứa một hoặc nhiều đối tượng được hiển thị dưới dạng chuỗi. Biểu mẫu nên được sử dụng là một chuỗi. tiêu đềTiêu đề của hộp thoại. default default option is "input"Trả về
khoảng trống trợ giúp (chuỗi định dạng)Hiển thị tham chiếu API Monkeyrunner theo kiểu tương tự như công cụ 03 của Python, sử dụng định dạng được định dạng duy nhấtArgumentformatĐịnh dạng đánh dấu để sử dụng trong đầu ra. Các giá trị có thể sử dụng là "text" cho HTML thuần hoặc "html" cho HTMLchuỗi nhập (chuỗi thông báo chuỗi initialValue, chuỗi tiêu đề, chuỗi okTitle, chuỗi hủyTitle)Hiển thị hộp thoại chấp nhận dữ liệu nhập và trả lại dữ liệu cho chương trình. Hộp thoại đã ở chế độ nên chương trình sẽ tạm dừng cho đến khi người dùng nhấp vào một trong các nút của hộp thoại Hộp thoại này có hai nút, một số trong đó hiển thị giá trị okTitle và nút còn lại có giá trị hủyTiêu đề. Nếu người dùng nhấp vào nút okTitle, thì giá trị hiện tại của hộp nhập sẽ được trả về. Nếu người dùng nhấp vào nút hủy Tiêu đề, thì một chuỗi trống sẽ được trả về Chúng tôi đã được giao một bài tập trong đó người dùng phải nhập hai số và đầu ra phải là các số nằm giữa hai số đã cho, với điều kiện đầu vào duy nhất là các số và nếu người dùng nhập bất kỳ thứ gì khác ngoài đó sẽ in ra "NGÕ VÀO KHÔNG HỢP LỆ. " Nội dung chính Hiển thị Đây là những gì tôi đã cố gắng
Đó là bởi vì bộ đệm hệ điều hành sau đó ghi vào đầu ra tiêu chuẩn trong trường hợp này. Bạn cần biết rằng có ba loại luồng liên quan đến bộ đệm
Không có bộ đệm thì rõ ràng, nghĩa là không có bộ đệm nào diễn ra và tất cả các thao tác ghi đều có hiệu lực ngay lập tức. Luồng có bộ đệm dòng chờ trước khi thực hiện bất kỳ lệnh gọi I/O nào cho đến khi ngắt dòng xuất hiện ở đâu đó trong bộ đệm, trong khi luồng có bộ đệm khối chỉ đơn giản cho phép bộ đệm lấp đầy đến một kích thước nhất định bất kể nội dung của nó là gì. Đầu ra tiêu chuẩn có cả bộ đệm dòng và bộ đệm khối, tùy thuộc vào sự kiện nào đến trước Bộ đệm giúp giảm số lượng cuộc gọi I/O đắt tiền. Ví dụ, hãy nghĩ về việc gửi tin nhắn qua mạng có độ trễ cao. Khi bạn kết nối với một máy chủ từ xa để thực thi các lệnh qua giao thức SSH, mỗi lần nhấn phím của bạn thực sự có thể tạo ra một gói dữ liệu riêng lẻ, có kích thước lớn hơn tải trọng của nó. Thật là một chi phí. Sẽ hợp lý nếu đợi cho đến khi ít nhất một vài ký tự được nhập và sau đó gửi chúng cùng nhau. Đó là nơi bộ đệm bước vào Mặt khác, bộ đệm đôi khi có thể có tác dụng không mong muốn như bạn vừa thấy với ví dụ đếm ngược. Để khắc phục, bạn chỉ cần yêu cầu 66 xóa mạnh luồng mà không cần chờ ký tự xuống dòng trong bộ đệm bằng cách sử dụng cờ 01 của nó 2Đó là tất cả. Bộ đếm ngược của bạn sẽ hoạt động như mong đợi ngay bây giờ, nhưng đừng tin lời tôi. Hãy tiếp tục và kiểm tra nó để thấy sự khác biệt Xin chúc mừng. Tại thời điểm này, bạn đã thấy các ví dụ về cách gọi 66 bao gồm tất cả các tham số của nó. Bạn biết mục đích của chúng và khi nào nên sử dụng chúng. Tuy nhiên, việc hiểu chữ ký chỉ là bước đầu. Trong các phần sắp tới, bạn sẽ thấy tại saoKhông có cách nào dễ dàng để xóa luồng trong Python 2, vì bản thân câu lệnh 04 không cho phép thực hiện điều đó. Bạn cần xử lý lớp cấp thấp hơn của nó, đây là đầu ra tiêu chuẩn và gọi nó trực tiếp 3Ngoài ra, bạn có thể vô hiệu hóa tính năng đệm của các luồng tiêu chuẩn bằng cách cung cấp cờ 04 cho trình thông dịch Python hoặc bằng cách thiết lập biến môi trường 05 4Lưu ý rằng 66 đã được nhập vào Python 2 và được cung cấp thông qua mô-đun 08. Thật không may, nó không đi kèm với tham số 01>>> 5Những gì bạn đang thấy ở đây là một chuỗi tài liệu của hàm 66. Bạn có thể hiển thị các chuỗi tài liệu của các đối tượng khác nhau trong Python bằng cách sử dụng chức năng 10 tích hợpIn các loại dữ liệu tùy chỉnhCho đến bây giờ, bạn chỉ xử lý các kiểu dữ liệu dựng sẵn như chuỗi và số, nhưng bạn sẽ thường muốn in các kiểu dữ liệu trừu tượng của riêng mình. Chúng ta hãy xem xét các cách khác nhau để định nghĩa chúng Đối với các đối tượng đơn giản không có bất kỳ logic nào, mục đích là mang dữ liệu, thông thường bạn sẽ tận dụng lợi thế của 11, có sẵn trong thư viện tiêu chuẩn. Các bộ dữ liệu được đặt tên có một biểu diễn văn bản gọn gàng ngoài hộp>>> 6Điều đó thật tuyệt miễn là giữ dữ liệu là đủ, nhưng để thêm các hành vi vào loại 12, cuối cùng bạn sẽ cần xác định một lớp. Hãy xem ví dụ này 7Nếu bây giờ bạn tạo một thể hiện của lớp 12 và thử in nó, bạn sẽ nhận được kết quả kỳ lạ này, khá khác so với lớp 11 tương đương>>> 8Đó là biểu diễn mặc định của các đối tượng, bao gồm địa chỉ của chúng trong bộ nhớ, tên lớp tương ứng và mô-đun trong đó chúng được định nghĩa. Bạn sẽ khắc phục điều đó trong giây lát, nhưng chỉ để ghi lại, như một giải pháp thay thế nhanh chóng, bạn có thể kết hợp 11 và một lớp tùy chỉnh thông qua kế thừa 9Lớp 12 của bạn vừa trở thành một loại 11 chuyên biệt với hai thuộc tính mà bạn có thể tùy chỉnhĐiều đó tốt hơn một 11 đơn giản, bởi vì bạn không chỉ được in miễn phí mà còn có thể thêm các phương thức và thuộc tính tùy chỉnh vào lớp. Tuy nhiên, nó giải quyết một vấn đề trong khi giới thiệu một vấn đề khác. Hãy nhớ rằng các bộ dữ liệu, bao gồm cả các bộ dữ liệu được đặt tên, là bất biến trong Python, vì vậy chúng không thể thay đổi giá trị của chúng sau khi được tạoĐúng là mong muốn thiết kế các kiểu dữ liệu bất biến, nhưng trong nhiều trường hợp, bạn sẽ muốn chúng cho phép thay đổi, vì vậy bạn quay lại với các lớp thông thường Từ các tiểu mục trước, bạn đã biết rằng 66 ngầm gọi hàm 02 tích hợp để chuyển đổi các đối số vị trí của nó thành các chuỗi. Thật vậy, gọi 02 theo cách thủ công đối với một thể hiện của lớp 12 thông thường mang lại kết quả tương tự như in nó>>> 20Ngược lại, 02 tìm kiếm một trong hai phương thức kỳ diệu trong nội dung lớp mà bạn thường triển khai. Nếu nó không tìm thấy, thì nó sẽ quay trở lại biểu diễn mặc định xấu xí. Những phương pháp kỳ diệu đó, theo thứ tự tìm kiếm
Cái đầu tiên được khuyến nghị trả về một văn bản ngắn, con người có thể đọc được, bao gồm thông tin từ các thuộc tính có liên quan nhất. Rốt cuộc, bạn không muốn để lộ dữ liệu nhạy cảm, chẳng hạn như mật khẩu người dùng, khi in các đối tượng Tuy nhiên, cái còn lại phải cung cấp thông tin đầy đủ về một đối tượng, để cho phép khôi phục trạng thái của nó từ một chuỗi. Lý tưởng nhất là nó sẽ trả về mã Python hợp lệ để bạn có thể chuyển trực tiếp mã đó tới 26>>> 21Lưu ý việc sử dụng một hàm dựng sẵn khác, 27, luôn cố gắng gọi 28 trong một đối tượng, nhưng sẽ quay lại biểu diễn mặc định nếu không tìm thấy phương thức đóPython mang đến cho bạn rất nhiều sự tự do khi xác định các kiểu dữ liệu của riêng bạn nếu không có kiểu tích hợp sẵn nào đáp ứng nhu cầu của bạn. Một số trong số chúng, chẳng hạn như các bộ dữ liệu được đặt tên và các lớp dữ liệu, cung cấp các biểu diễn chuỗi trông đẹp mắt mà không yêu cầu bất kỳ công việc nào từ phía bạn. Tuy nhiên, để linh hoạt nhất, bạn sẽ phải định nghĩa một lớp và ghi đè các phương thức ma thuật của nó được mô tả ở trên Ngữ nghĩa của 29 và 28 không thay đổi kể từ Python 2, nhưng bạn phải nhớ rằng các chuỗi không có gì khác hơn là các mảng byte được tôn vinh vào thời điểm đó. Để chuyển đổi các đối tượng của bạn thành Unicode thích hợp, là một loại dữ liệu riêng biệt, bạn phải cung cấp một phương pháp kỳ diệu khác. 31Đây là một ví dụ về cùng một lớp 32 trong Python 2 22Như bạn có thể thấy, việc triển khai này ủy thác một số công việc để tránh trùng lặp bằng cách tự gọi hàm 33 tích hợp sẵnCả hai phương thức 29 và 28 đều phải trả về chuỗi, vì vậy chúng mã hóa các ký tự Unicode thành các biểu diễn byte cụ thể được gọi là bộ ký tự. UTF-8 là mã hóa phổ biến nhất và an toàn nhất, trong khi 36 là hằng số đặc biệt để biểu thị các ký tự vui nhộn, chẳng hạn như 37, dưới dạng các chuỗi thoát trong ASCII đơn giản, chẳng hạn như 38Câu lệnh 04 đang tìm kiếm phương thức 29 ma thuật trong lớp, vì vậy bộ ký tự được chọn phải tương ứng với bộ ký tự được sử dụng bởi thiết bị đầu cuối. Ví dụ: mã hóa mặc định trong DOS và Windows là CP 852 chứ không phải UTF-8, vì vậy việc chạy mã này có thể dẫn đến kết quả đầu ra 94 hoặc thậm chí bị cắt xén>>> 23Tuy nhiên, nếu bạn chạy cùng một mã trên hệ thống có mã hóa UTF-8, thì bạn sẽ nhận được cách viết đúng của một tên tiếng Nga phổ biến >>> 24Bạn nên chuyển đổi các chuỗi thành Unicode càng sớm càng tốt, chẳng hạn như khi bạn đang đọc dữ liệu từ một tệp và sử dụng nó một cách nhất quán ở mọi nơi trong mã của bạn. Đồng thời, bạn nên mã hóa Unicode trở lại bộ ký tự đã chọn ngay trước khi trình bày cho người dùng Có vẻ như bạn có nhiều quyền kiểm soát hơn đối với biểu diễn chuỗi của các đối tượng trong Python 2 vì không còn phương thức 31 thần kỳ nào trong Python 3 nữa. Bạn có thể tự hỏi liệu có thể chuyển đổi một đối tượng thành biểu diễn chuỗi byte của nó thay vì chuỗi Unicode trong Python 3 không. Có thể, với một phương pháp đặc biệt 43 thực hiện điều đó>>> 25Sử dụng hàm 44 tích hợp trên một cá thể ủy quyền cuộc gọi đến phương thức 45 của nó được định nghĩa trong lớp tương ứngHiểu Python print()Bạn biết cách sử dụng 66 khá tốt vào thời điểm này, nhưng biết nó là gì sẽ cho phép bạn sử dụng nó hiệu quả và có ý thức hơn. Sau khi đọc phần này, bạn sẽ hiểu cách in bằng Python đã được cải thiện như thế nào trong những năm quaIn là một chức năng trong Python 3Bạn đã thấy rằng 66 là một hàm trong Python 3. Cụ thể hơn, đó là chức năng tích hợp sẵn, nghĩa là bạn không cần phải nhập nó từ bất cứ đâu>>> 26Nó luôn có sẵn trong không gian tên chung để bạn có thể gọi nó trực tiếp, nhưng bạn cũng có thể truy cập nó thông qua một mô-đun từ thư viện chuẩn >>> 27Bằng cách này, bạn có thể tránh xung đột tên với các chức năng tùy chỉnh. Giả sử bạn muốn xác định lại 66 để nó không thêm một dòng mới ở cuối. Đồng thời, bạn muốn đổi tên chức năng ban đầu thành một cái gì đó như 49>>> 28Bây giờ bạn có hai chức năng in riêng biệt giống như trong ngôn ngữ lập trình Java. Sau này, bạn cũng sẽ định nghĩa các hàm 66 tùy chỉnh trong phần mô phỏng. Ngoài ra, lưu ý rằng bạn sẽ không thể ghi đè lên 66 ngay từ đầu nếu đó không phải là một chức năngMặt khác, 66 không phải là một hàm theo nghĩa toán học, bởi vì nó không trả về bất kỳ giá trị có ý nghĩa nào ngoài giá trị ngầm định 99>>> 29Trên thực tế, các chức năng như vậy là các thủ tục hoặc chương trình con mà bạn gọi để đạt được một loại hiệu ứng phụ nào đó, cuối cùng là sự thay đổi trạng thái toàn cầu. Trong trường hợp của 66, tác dụng phụ đó là hiển thị một thông báo trên đầu ra tiêu chuẩn hoặc ghi vào một tệpVì 66 là một hàm nên nó có chữ ký được xác định rõ ràng với các thuộc tính đã biết. Bạn có thể nhanh chóng tìm thấy tài liệu của nó bằng cách sử dụng trình chỉnh sửa mà bạn chọn mà không cần phải nhớ một số cú pháp kỳ lạ để thực hiện một tác vụ nhất địnhBên cạnh đó, các chức năng dễ dàng mở rộng hơn. Việc thêm một tính năng mới vào một chức năng cũng dễ dàng như thêm một đối số từ khóa khác, trong khi việc thay đổi ngôn ngữ để hỗ trợ tính năng mới đó thì cồng kềnh hơn nhiều. Ví dụ, hãy nghĩ về chuyển hướng luồng hoặc xóa bộ đệm Một lợi ích khác của việc 66 là một chức năng là khả năng kết hợp. Các hàm được gọi là đối tượng hạng nhất hoặc công dân hạng nhất trong Python, đây là một cách thú vị để nói rằng chúng là các giá trị giống như chuỗi hoặc số. Bằng cách này, bạn có thể gán một hàm cho một biến, chuyển nó sang một hàm khác hoặc thậm chí trả về một hàm từ một hàm khác. 66 không khác biệt về vấn đề này. Chẳng hạn, bạn có thể tận dụng nó để tiêm phụ thuộc 70Ở đây, tham số 58 cho phép bạn thêm chức năng gọi lại, mặc định là 66 nhưng có thể là bất kỳ chức năng nào có thể gọi được. Trong ví dụ này, việc in bị vô hiệu hóa hoàn toàn bằng cách thay thế 66 bằng một hàm giả không làm gì cảThành phần cho phép bạn kết hợp một số chức năng thành một chức năng mới cùng loại. Hãy xem điều này hoạt động bằng cách chỉ định một hàm 61 tùy chỉnh in ra luồng lỗi tiêu chuẩn và thêm tiền tố vào tất cả các thông báo với một mức nhật ký nhất định>>> 71Chức năng tùy chỉnh này sử dụng các chức năng từng phần để đạt được hiệu quả mong muốn. Đó là một khái niệm nâng cao mượn từ mô hình lập trình chức năng, vì vậy bạn không cần phải đi quá sâu vào chủ đề đó vào lúc này. Tuy nhiên, nếu bạn quan tâm đến chủ đề này, tôi khuyên bạn nên xem mô-đun 62Không giống như câu lệnh, chức năng là giá trị. Điều đó có nghĩa là bạn có thể kết hợp chúng với các biểu thức, cụ thể là biểu thức lambda. Thay vì xác định một hàm toàn diện để thay thế 66 bằng, bạn có thể tạo một biểu thức lambda ẩn danh để gọi nó>>> 72Tuy nhiên, vì một biểu thức lambda được xác định tại chỗ nên không có cách nào đề cập đến nó ở nơi khác trong mã Một loại biểu thức khác là biểu thức điều kiện bậc ba >>> 73Python có cả câu lệnh điều kiện và biểu thức điều kiện. Cái sau được đánh giá thành một giá trị có thể được gán cho một biến hoặc được truyền cho một hàm. Trong ví dụ trên, bạn quan tâm đến tác dụng phụ hơn là giá trị, đánh giá là 99, vì vậy bạn chỉ cần bỏ qua nóNhư bạn có thể thấy, các hàm cho phép một giải pháp tao nhã và có thể mở rộng, phù hợp với phần còn lại của ngôn ngữ. Trong tiểu mục tiếp theo, bạn sẽ khám phá ra việc không có hàm 66 gây ra nhiều vấn đề đau đầu như thế nàoin Là một Tuyên bố trong Python 2Một câu lệnh là một hướng dẫn có thể gây ra tác dụng phụ khi được thực thi nhưng không bao giờ đánh giá thành một giá trị. Nói cách khác, bạn sẽ không thể in một câu lệnh hoặc gán nó cho một biến như thế này 74Đó là lỗi cú pháp trong Python 2 Dưới đây là một vài ví dụ khác về câu lệnh trong Python
Các câu thường bao gồm các từ khóa dành riêng như 67, 71 hoặc 04 có nghĩa cố định trong ngôn ngữ. Bạn không thể sử dụng chúng để đặt tên cho các biến của mình hoặc các ký hiệu khác. Đó là lý do tại sao không thể xác định lại hoặc chế nhạo câu lệnh 04 trong Python 2. Bạn bị mắc kẹt với những gì bạn nhận đượcNgoài ra, bạn không thể in từ các hàm ẩn danh vì các câu lệnh không được chấp nhận trong các biểu thức lambda >>> 75Cú pháp của câu lệnh 04 không rõ ràng. Đôi khi bạn có thể thêm dấu ngoặc đơn xung quanh tin nhắn và chúng hoàn toàn không bắt buộc>>> 76Vào những thời điểm khác, họ thay đổi cách in tin nhắn >>> 77Nối chuỗi có thể tăng 75 do các loại không tương thích, chẳng hạn như bạn phải xử lý thủ công>>> 78So sánh mã này với mã tương tự trong Python 3, mã này thúc đẩy giải nén trình tự >>> 79Không có bất kỳ đối số từ khóa nào cho các tác vụ phổ biến như xóa bộ đệm hoặc chuyển hướng luồng. Thay vào đó, bạn cần nhớ cú pháp kỳ quặc. Ngay cả hàm 10 tích hợp cũng không hữu ích đối với câu lệnh 04>>> 00Loại bỏ dòng mới ở cuối không hoạt động hoàn toàn đúng vì nó thêm một khoảng trống không mong muốn. Bạn không thể soạn nhiều câu lệnh 04 cùng nhau và trên hết, bạn phải cực kỳ siêng năng về mã hóa ký tựDanh sách các vấn đề cứ lặp đi lặp lại. Nếu tò mò, bạn có thể quay lại phần trước và tìm kiếm các giải thích chi tiết hơn về cú pháp trong Python 2 Tuy nhiên, bạn có thể giảm thiểu một số vấn đề đó bằng cách tiếp cận đơn giản hơn nhiều. Hóa ra hàm 66 đã được nhập vào để dễ dàng chuyển sang Python 3. Bạn có thể nhập nó từ một mô-đun 08 đặc biệt, hiển thị một loạt các tính năng ngôn ngữ được phát hành trong các phiên bản Python sau nàyĐể bật hàm 66 trong Python 2, bạn cần thêm câu lệnh nhập này vào đầu mã nguồn của mình 01Từ giờ câu lệnh 04 không còn nữa, nhưng bạn có hàm 66 tùy ý sử dụng. Lưu ý rằng nó không giống chức năng như trong Python 3, vì nó thiếu đối số từ khóa 01, nhưng các đối số còn lại đều giống nhauNgoài ra, nó không giúp bạn quản lý mã hóa ký tự đúng cách Đây là một ví dụ về cách gọi hàm 66 trong Python 2>>> 02Bây giờ bạn đã có ý tưởng về cách in bằng Python đã phát triển và quan trọng nhất là hiểu tại sao những thay đổi không tương thích ngược này lại cần thiết. Biết điều này chắc chắn sẽ giúp bạn trở thành một lập trình viên Python giỏi hơn In Với Phong CáchNếu bạn nghĩ rằng in ấn chỉ là làm sáng các điểm ảnh trên màn hình, thì về mặt kỹ thuật, bạn đã đúng. Tuy nhiên, có nhiều cách để làm cho nó trông thật ngầu. Trong phần này, bạn sẽ tìm hiểu cách định dạng cấu trúc dữ liệu phức tạp, thêm màu sắc và các trang trí khác, xây dựng giao diện, sử dụng hoạt ảnh và thậm chí phát âm thanh với văn bản Cấu trúc dữ liệu lồng nhau in đẹpNgôn ngữ máy tính cho phép bạn biểu diễn dữ liệu cũng như mã thực thi theo cách có cấu trúc. Tuy nhiên, không giống như Python, hầu hết các ngôn ngữ đều cho phép bạn tự do sử dụng khoảng trắng và định dạng. Điều này có thể hữu ích, chẳng hạn như trong quá trình nén, nhưng đôi khi nó dẫn đến mã khó đọc hơn In đẹp là làm cho một đoạn dữ liệu hoặc mã trông hấp dẫn hơn đối với mắt người để có thể hiểu nó dễ dàng hơn. Điều này được thực hiện bằng cách thụt lề một số dòng nhất định, chèn dòng mới, sắp xếp lại các phần tử, v.v. Python đi kèm với mô-đun 86 trong thư viện tiêu chuẩn của nó, sẽ giúp bạn in các cấu trúc dữ liệu lớn đẹp mắt không vừa trên một dòng. Vì nó in theo cách thân thiện với con người hơn nên nhiều công cụ REPL phổ biến, bao gồm JupyterLab và IPython, sử dụng nó theo mặc định thay cho hàm 66 thông thườngNếu bạn không quan tâm đến việc không có quyền truy cập vào hàm 66 ban đầu, thì bạn có thể thay thế nó bằng 89 trong mã của mình bằng cách nhập đổi tên>>> 03Cá nhân tôi muốn có cả hai chức năng trong tầm tay, vì vậy tôi muốn sử dụng một cái gì đó như 90 làm bí danh ngắn 04Thoạt nhìn, hầu như không có bất kỳ sự khác biệt nào giữa hai chức năng và trong một số trường hợp hầu như không có >>> 05Đó là bởi vì 89 gọi 27 thay vì 02 thông thường để truyền kiểu, do đó bạn có thể đánh giá đầu ra của nó dưới dạng mã Python nếu bạn muốn. Sự khác biệt trở nên rõ ràng khi bạn bắt đầu cung cấp cho nó các cấu trúc dữ liệu phức tạp hơn>>> 06Hàm áp dụng định dạng hợp lý để cải thiện khả năng đọc, nhưng bạn có thể tùy chỉnh nó hơn nữa với một vài tham số. Ví dụ: bạn có thể giới hạn cấu trúc phân cấp được lồng sâu bằng cách hiển thị dấu chấm lửng bên dưới một mức nhất định >>> 07 66 thông thường cũng sử dụng dấu chấm lửng nhưng để hiển thị cấu trúc dữ liệu đệ quy, tạo thành một chu trình, để tránh lỗi tràn ngăn xếp>>> 08Tuy nhiên, 89 rõ ràng hơn về nó bằng cách bao gồm danh tính duy nhất của một đối tượng tự tham chiếu>>> 09Phần tử cuối cùng trong danh sách là cùng một đối tượng với toàn bộ danh sách 89 tự động sắp xếp các khóa từ điển cho bạn trước khi in, cho phép so sánh nhất quán. Khi bạn đang so sánh các chuỗi, bạn thường không quan tâm đến thứ tự cụ thể của các thuộc tính được tuần tự hóa. Dù sao đi nữa, tốt nhất bạn nên so sánh các từ điển thực tế trước khi đăng nhiều kỳ hơnTừ điển thường biểu thị dữ liệu JSON, được sử dụng rộng rãi trên Internet. Để tuần tự hóa chính xác một từ điển thành một chuỗi có định dạng JSON hợp lệ, bạn có thể tận dụng mô-đun 97. Nó cũng có khả năng in đẹp>>> 10Tuy nhiên, xin lưu ý rằng bạn cần tự xử lý việc in, vì đó không phải là việc bạn thường muốn làm. Tương tự, mô-đun 86 có thêm một hàm 99 trả về một chuỗi, trong trường hợp bạn phải làm gì đó ngoài việc in nóNgạc nhiên thay, chữ ký của 89 không giống chữ ký của hàm 66. Bạn thậm chí không thể chuyển nhiều hơn một đối số vị trí, điều này cho thấy mức độ tập trung của nó vào việc in cấu trúc dữ liệuThêm màu với chuỗi thoát ANSIKhi máy tính cá nhân trở nên phức tạp hơn, chúng có đồ họa tốt hơn và có thể hiển thị nhiều màu sắc hơn. Tuy nhiên, các nhà cung cấp khác nhau có ý tưởng riêng về thiết kế API để kiểm soát nó. Điều đó đã thay đổi cách đây vài thập kỷ khi những người ở Viện Tiêu chuẩn Quốc gia Hoa Kỳ quyết định thống nhất nó bằng cách xác định mã thoát ANSI Hầu hết các trình giả lập thiết bị đầu cuối ngày nay đều hỗ trợ tiêu chuẩn này ở một mức độ nào đó. Cho đến gần đây, hệ điều hành Windows là một ngoại lệ đáng chú ý. Do đó, nếu bạn muốn tính di động tốt nhất, hãy sử dụng thư viện 4202 trong Python. Nó dịch mã ANSI sang các đối tác thích hợp của chúng trong Windows trong khi vẫn giữ chúng nguyên vẹn trong các hệ điều hành khácĐể kiểm tra xem thiết bị đầu cuối của bạn có hiểu một tập hợp con của chuỗi thoát ANSI hay không, chẳng hạn như liên quan đến màu sắc, bạn có thể thử sử dụng lệnh sau Thiết bị đầu cuối mặc định của tôi trên Linux cho biết nó có thể hiển thị 256 màu riêng biệt, trong khi xterm chỉ cho tôi 8. Lệnh sẽ trả về số âm nếu màu không được hỗ trợ Chuỗi thoát ANSI giống như một ngôn ngữ đánh dấu cho thiết bị đầu cuối. Trong HTML, bạn làm việc với các thẻ, chẳng hạn như 4203 hoặc 4204, để thay đổi giao diện của các phần tử trong tài liệu. Các thẻ này được trộn lẫn với nội dung của bạn nhưng bản thân chúng không hiển thị. Tương tự, mã thoát sẽ không hiển thị trong thiết bị đầu cuối miễn là nó nhận ra chúng. Nếu không, chúng sẽ xuất hiện ở dạng chữ như thể bạn đang xem mã nguồn của một trang webNhư tên gọi của nó, một chuỗi phải bắt đầu bằng ký tự Esc không in được, có giá trị ASCII là 27, đôi khi được ký hiệu là 4205 . Bạn có thể sử dụng chữ số Python để nhanh chóng xác minh đó thực sự là cùng một số. >>> 11Ngoài ra, bạn có thể lấy nó bằng chuỗi thoát 4207 trong trình baoCác chuỗi thoát ANSI phổ biến nhất có dạng sau ElementDescriptionExample Esc ký tự thoát không in được 4208 4209mở dấu ngoặc vuông 4209mã sốmột hoặc nhiều số được phân tách bằng 4211 4212mã ký tự chữ hoa hoặc chữ thường 4213Mã số có thể là một hoặc nhiều số được phân tách bằng dấu chấm phẩy, trong khi mã ký tự chỉ là một chữ cái. Ý nghĩa cụ thể của chúng được xác định theo tiêu chuẩn ANSI. Ví dụ: để đặt lại tất cả định dạng, bạn sẽ nhập một trong các lệnh sau, sử dụng mã số 0 và chữ cái 4213 12Ở đầu kia của quang phổ, bạn có các giá trị mã phức hợp. Để đặt nền trước và nền sau với các kênh RGB, với điều kiện là thiết bị đầu cuối của bạn hỗ trợ độ sâu 24 bit, bạn có thể cung cấp nhiều số 13Bạn không chỉ có thể đặt màu văn bản bằng mã thoát ANSI. Ví dụ: bạn có thể xóa và cuộn cửa sổ đầu cuối, thay đổi nền của nó, di chuyển con trỏ xung quanh, làm cho văn bản nhấp nháy hoặc trang trí bằng gạch dưới Trong Python, bạn có thể viết một hàm trợ giúp để cho phép gói các mã tùy ý thành một chuỗi >>> 14Điều này sẽ làm cho từ 4215 xuất hiện ở phông chữ màu đỏ, in đậm và gạch chânTuy nhiên, có những khái niệm trừu tượng cấp cao hơn đối với mã thoát ANSI, chẳng hạn như thư viện 4202 đã đề cập, cũng như các công cụ để xây dựng giao diện người dùng trong bảng điều khiểnXây dựng giao diện người dùng bảng điều khiểnMặc dù không thể phủ nhận việc chơi với các mã thoát ANSI rất thú vị, nhưng trong thế giới thực, bạn muốn có nhiều khối xây dựng trừu tượng hơn để kết hợp giao diện người dùng. Có một số thư viện cung cấp mức độ kiểm soát cao như vậy đối với thiết bị đầu cuối, nhưng 4217 dường như là lựa chọn phổ biến nhấtVề cơ bản, nó cho phép bạn suy nghĩ về các tiện ích đồ họa độc lập thay vì một khối văn bản. Bên cạnh đó, bạn có rất nhiều tự do trong việc thể hiện nghệ sĩ bên trong của mình, bởi vì nó thực sự giống như vẽ một bức tranh trống. Thư viện che giấu sự phức tạp của việc phải xử lý các thiết bị đầu cuối khác nhau. Ngoài ra, nó còn hỗ trợ tuyệt vời cho các sự kiện bàn phím, có thể hữu ích khi viết trò chơi điện tử Làm thế nào về việc làm một trò chơi rắn cổ điển? Trước tiên, bạn cần nhập mô-đun 4217. Vì nó sửa đổi trạng thái của thiết bị đầu cuối đang chạy, điều quan trọng là phải xử lý lỗi và khôi phục trạng thái trước đó một cách duyên dáng. Bạn có thể thực hiện việc này theo cách thủ công, nhưng thư viện đi kèm với trình bao bọc thuận tiện cho chức năng chính của bạn 15Lưu ý, hàm phải chấp nhận tham chiếu đến đối tượng màn hình, còn được gọi là ________ 14219, mà bạn sẽ sử dụng sau này để thiết lập bổ sung Nếu bạn chạy chương trình này ngay bây giờ, bạn sẽ không thấy bất kỳ hiệu ứng nào, vì nó sẽ kết thúc ngay lập tức. Tuy nhiên, bạn có thể thêm một độ trễ nhỏ để xem trước 16Lần này, màn hình hoàn toàn trống trong một giây, nhưng con trỏ vẫn nhấp nháy. Để ẩn nó, chỉ cần gọi một trong các chức năng cấu hình được xác định trong mô-đun 17Hãy định nghĩa con rắn là một danh sách các điểm trong tọa độ màn hình 18Đầu rắn luôn là phần tử đầu tiên trong danh sách, trong khi đuôi là phần tử cuối cùng. Hình dạng ban đầu của con rắn nằm ngang, bắt đầu từ góc trên cùng bên trái của màn hình và hướng sang bên phải. Trong khi tọa độ y của nó vẫn ở mức 0, thì tọa độ x của nó giảm dần từ đầu đến đuôi Để vẽ con rắn, bạn sẽ bắt đầu với phần đầu và sau đó làm theo các đoạn còn lại. Mỗi đoạn mang tọa độ 4220, vì vậy bạn có thể giải nén chúng 19Một lần nữa, nếu bạn chạy mã này ngay bây giờ, nó sẽ không hiển thị bất cứ thứ gì vì bạn phải làm mới màn hình một cách rõ ràng sau đó 20Bạn muốn di chuyển con rắn theo một trong bốn hướng, có thể được định nghĩa là vectơ. Cuối cùng, hướng sẽ thay đổi để đáp ứng với một lần nhấn phím mũi tên, vì vậy bạn có thể kết nối nó với các mã khóa của thư viện 21Làm thế nào để một con rắn di chuyển? . Ở mỗi bậc hầu như các phân khúc đều được giữ nguyên ngoại trừ phần đầu và phần đuôi. Giả sử con rắn không phát triển, bạn có thể bỏ đuôi và chèn một cái đầu mới vào đầu danh sách 22Để có tọa độ mới của đầu, bạn cần thêm vectơ chỉ phương vào đó. Tuy nhiên, việc thêm các bộ trong Python dẫn đến một bộ lớn hơn thay vì tổng đại số của các thành phần vectơ tương ứng. Một cách để khắc phục điều này là sử dụng các hàm 4221, 4222 và 4223 tích hợp sẵnHướng sẽ thay đổi khi nhấn phím, vì vậy bạn cần gọi ____14224 để lấy mã phím nhấn. Tuy nhiên, nếu phím được nhấn không tương ứng với các phím mũi tên được xác định trước đó là phím từ điển, hướng sẽ không thay đổi 23Tuy nhiên, theo mặc định, 4224 là một cuộc gọi chặn sẽ ngăn con rắn di chuyển trừ khi có một lần nhấn phím. Do đó, bạn cần thực hiện cuộc gọi không bị chặn bằng cách thêm một cấu hình khác 24Bạn sắp hoàn thành, nhưng chỉ còn một việc cuối cùng. Nếu bây giờ bạn lặp đoạn mã này, con rắn sẽ có vẻ như đang lớn lên thay vì di chuyển. Đó là bởi vì bạn phải xóa màn hình một cách rõ ràng trước mỗi lần lặp lại Cuối cùng, đây là tất cả những gì bạn cần để chơi trò rắn săn mồi bằng Python 25Đây chỉ là bề ngoài của các khả năng mà mô-đun 4217 mở ra. Bạn có thể sử dụng nó để phát triển trò chơi như thế này hoặc nhiều ứng dụng định hướng kinh doanh hơnSống hết mình với những hình ảnh động thú vịHoạt ảnh không chỉ có thể làm cho giao diện người dùng bắt mắt hơn mà còn cải thiện trải nghiệm người dùng tổng thể. Ví dụ: khi bạn cung cấp phản hồi sớm cho người dùng, họ sẽ biết liệu chương trình của bạn có còn hoạt động hay không hay đã đến lúc kết thúc chương trình đó Để tạo hiệu ứng động cho văn bản trong thiết bị đầu cuối, bạn phải có thể tự do di chuyển con trỏ xung quanh. Bạn có thể thực hiện việc này bằng một trong những công cụ đã đề cập trước đây, đó là mã thoát ANSI hoặc thư viện 4217. Tuy nhiên, tôi muốn chỉ cho bạn một cách thậm chí còn đơn giản hơnNếu hoạt ảnh có thể bị giới hạn trong một dòng văn bản, thì bạn có thể quan tâm đến hai chuỗi ký tự thoát đặc biệt
Cái đầu tiên di chuyển con trỏ đến đầu dòng, trong khi cái thứ hai chỉ di chuyển con trỏ sang trái một ký tự. Cả hai đều hoạt động theo cách không phá hủy mà không ghi đè lên văn bản đã được viết Hãy xem xét một vài ví dụ Bạn sẽ thường muốn hiển thị một số loại bánh xe quay để chỉ ra một công việc đang tiến hành mà không biết chính xác còn bao nhiêu thời gian để hoàn thành Nhiều công cụ dòng lệnh sử dụng thủ thuật này khi tải dữ liệu qua mạng. Bạn có thể tạo hoạt hình chuyển động dừng thực sự đơn giản từ một chuỗi các ký tự sẽ quay vòng theo kiểu vòng tròn 26Vòng lặp lấy ký tự tiếp theo để in, sau đó di chuyển con trỏ đến đầu dòng và ghi đè lên bất kỳ ký tự nào trước đó mà không cần thêm dòng mới. Bạn không muốn có thêm khoảng trống giữa các đối số vị trí, vì vậy đối số dấu phân cách phải để trống. Ngoài ra, hãy lưu ý việc sử dụng các chuỗi thô của Python do các ký tự dấu gạch chéo ngược có trong nghĩa đen Khi bạn biết thời gian còn lại hoặc phần trăm hoàn thành nhiệm vụ, thì bạn có thể hiển thị thanh tiến trình động Trước tiên, bạn cần tính toán xem có bao nhiêu hashtag sẽ hiển thị và bao nhiêu khoảng trắng để chèn vào. Tiếp theo, bạn xóa dòng và xây dựng thanh từ đầu 27Như trước đây, mỗi yêu cầu cập nhật sẽ sơn lại toàn bộ dòng Tạo âm thanh với print()Nếu bạn đủ lớn để nhớ máy tính có loa PC, thì bạn cũng phải nhớ âm thanh bíp đặc biệt của chúng, thường được sử dụng để chỉ ra các sự cố phần cứng. Họ hầu như không thể tạo ra nhiều tiếng ồn hơn thế, nhưng các trò chơi điện tử dường như tốt hơn rất nhiều với nó Ngày nay, bạn vẫn có thể tận dụng chiếc loa nhỏ này, nhưng rất có thể máy tính xách tay của bạn không đi kèm với chiếc loa này. Trong trường hợp như vậy, bạn có thể bật mô phỏng chuông đầu cuối trong trình bao của mình để âm thanh cảnh báo hệ thống được phát thay thế Hãy tiếp tục và gõ lệnh này để xem thiết bị đầu cuối của bạn có thể phát âm thanh không Điều này thường sẽ in văn bản, nhưng cờ 4230 cho phép giải thích các dấu gạch chéo ngược thoát. Như bạn có thể thấy, có một chuỗi thoát chuyên dụng 4231, viết tắt của “alert”, tạo ra một ký tự chuông đặc biệt. Một số thiết bị đầu cuối phát ra âm thanh bất cứ khi nào họ nhìn thấy nóTương tự, bạn có thể in ký tự này bằng Python. Có lẽ trong một vòng lặp để tạo thành một loại giai điệu nào đó. Mặc dù đó chỉ là một ghi chú, nhưng bạn vẫn có thể thay đổi thời lượng tạm dừng giữa các lần liên tiếp. Đó có vẻ như là một món đồ chơi hoàn hảo để phát lại mã Morse Các quy tắc như sau
Theo các quy tắc đó, bạn có thể “in” tín hiệu SOS vô thời hạn theo cách sau 28Trong Python, bạn có thể triển khai nó chỉ trong mười dòng mã 29Có lẽ bạn thậm chí có thể tiến thêm một bước và tạo một công cụ dòng lệnh để dịch văn bản sang mã Morse? Mocking Python print() trong Bài kiểm tra đơn vịNgày nay, bạn mong đợi rằng bạn gửi mã đáp ứng các tiêu chuẩn chất lượng cao. Nếu bạn khao khát trở thành một chuyên gia, bạn phải học cách kiểm tra mã của mình Kiểm thử phần mềm đặc biệt quan trọng trong các ngôn ngữ được nhập động, chẳng hạn như Python, không có trình biên dịch để cảnh báo bạn về những lỗi rõ ràng. Các lỗi có thể tìm đường đến môi trường sản xuất và không hoạt động trong một thời gian dài, cho đến một ngày khi một nhánh mã cuối cùng được thực thi Chắc chắn rồi, bạn có linters, type checkers và các công cụ phân tích mã tĩnh khác để hỗ trợ bạn. Nhưng họ sẽ không cho bạn biết liệu chương trình của bạn có làm những gì nó phải làm ở cấp độ doanh nghiệp hay không Vì vậy, bạn có nên thử nghiệm 66 không? . Xét cho cùng, đó là một chức năng tích hợp sẵn phải trải qua một bộ kiểm tra toàn diện. Tuy nhiên, điều bạn muốn kiểm tra là liệu mã của bạn có đang gọi 66 vào đúng thời điểm với các tham số dự kiến hay không. Đó được gọi là một hành viBạn có thể kiểm tra các hành vi bằng cách mô phỏng các đối tượng hoặc chức năng thực. Trong trường hợp này, bạn muốn giả lập 66 để ghi lại và xác minh các yêu cầu của nóMocking trong Python có thể được thực hiện gấp đôi. Đầu tiên, bạn có thể đi theo con đường truyền thống của các ngôn ngữ được gõ tĩnh bằng cách sử dụng phép nội xạ phụ thuộc. Điều này đôi khi có thể yêu cầu bạn thay đổi mã đang được kiểm tra, điều này không phải lúc nào cũng thực hiện được nếu mã được xác định trong thư viện bên ngoài 30Đây là ví dụ giống như tôi đã sử dụng trong phần trước để nói về thành phần chức năng. Về cơ bản, nó cho phép thay thế 66 bằng chức năng tùy chỉnh của cùng một giao diện. Để kiểm tra xem nó có in đúng thông báo hay không, bạn phải chặn nó bằng cách đưa vào một hàm giả lập>>> 31Gọi mô hình này làm cho nó lưu thông báo cuối cùng trong một thuộc tính mà bạn có thể kiểm tra sau này, chẳng hạn như trong câu lệnh 69Trong một giải pháp hơi thay thế, thay vì thay thế toàn bộ hàm 66 bằng một trình bao bọc tùy chỉnh, bạn có thể chuyển hướng đầu ra tiêu chuẩn sang luồng ký tự giống như tệp trong bộ nhớ>>> 32Lần này, hàm gọi rõ ràng là 66, nhưng nó để lộ tham số 82 của nó ra thế giới bên ngoàiTuy nhiên, một cách mô phỏng các đối tượng Pythonic hơn tận dụng mô-đun 4240 tích hợp, sử dụng một kỹ thuật gọi là vá khỉ. Cái tên xúc phạm này bắt nguồn từ việc nó là một "mánh khóe bẩn thỉu" mà bạn có thể dễ dàng tự bắn vào chân mình. Nó kém thanh lịch hơn so với tiêm phụ thuộc nhưng chắc chắn nhanh chóng và tiện lợiBản vá khỉ làm gì là thay đổi triển khai một cách linh hoạt trong thời gian chạy. Một thay đổi như vậy có thể nhìn thấy trên toàn cầu, vì vậy nó có thể gây ra những hậu quả không mong muốn. Tuy nhiên, trên thực tế, việc vá lỗi chỉ ảnh hưởng đến mã trong thời gian thực hiện kiểm tra Để giả định 66 trong một trường hợp thử nghiệm, thông thường bạn sẽ sử dụng trình trang trí 4242 và chỉ định mục tiêu để vá bằng cách tham chiếu đến mục tiêu đó bằng một tên đủ điều kiện, bao gồm tên mô-đun 33Điều này sẽ tự động tạo mô hình cho bạn và đưa nó vào chức năng kiểm tra. Tuy nhiên, bạn cần khai báo rằng chức năng kiểm tra của bạn chấp nhận mô hình ngay bây giờ. Đối tượng mô phỏng bên dưới có rất nhiều phương thức và thuộc tính hữu ích để xác minh hành vi Bạn có nhận thấy điều gì đặc biệt về đoạn mã đó không? Mặc dù đã thêm một hàm giả vào hàm, nhưng bạn không gọi nó trực tiếp, mặc dù bạn có thể. Mô hình được đưa vào đó chỉ được sử dụng để đưa ra các xác nhận sau đó và có thể để chuẩn bị bối cảnh trước khi chạy thử nghiệm Trong cuộc sống thực, chế nhạo giúp cô lập mã đang kiểm tra bằng cách loại bỏ các phụ thuộc như kết nối cơ sở dữ liệu. Bạn hiếm khi gọi các bản giả trong một bài kiểm tra, vì điều đó không có nhiều ý nghĩa. Thay vào đó, đó là những đoạn mã khác gián tiếp gọi mô hình của bạn mà bạn không biết Đây là ý nghĩa của nó 34Mã đang kiểm tra là một chức năng in lời chào. Mặc dù đây là một chức năng khá đơn giản, nhưng bạn không thể dễ dàng kiểm tra nó vì nó không trả về giá trị. Nó có tác dụng phụ Để loại bỏ tác dụng phụ đó, bạn cần loại bỏ sự phụ thuộc. Bản vá cho phép bạn tránh thực hiện các thay đổi đối với chức năng ban đầu, điều này có thể vẫn là bất khả tri về 66. Nó nghĩ rằng nó đang gọi 66, nhưng trên thực tế, nó đang gọi một kẻ giả mạo mà bạn có toàn quyền kiểm soátCó nhiều lý do để kiểm thử phần mềm. Một trong số họ đang tìm kiếm lỗi. Ví dụ, khi bạn viết các bài kiểm tra, bạn thường muốn loại bỏ hàm 66 bằng cách chế nhạo nó. Tuy nhiên, nghịch lý thay, chính chức năng đó có thể giúp bạn tìm lỗi trong quá trình gỡ lỗi có liên quan mà bạn sẽ đọc trong phần tiếp theoBạn không thể vá câu lệnh 04 trong Python 2, bạn cũng không thể đưa nó vào như một phần phụ thuộc. Tuy nhiên, bạn có một vài lựa chọn khác
Hãy kiểm tra từng cái một Chuyển hướng luồng gần giống với ví dụ bạn đã thấy trước đó >>> 35Chỉ có hai sự khác biệt. Đầu tiên, cú pháp chuyển hướng luồng sử dụng chevron ( 4250) thay vì đối số 82. Sự khác biệt khác là nơi 4252 được xác định. Bạn có thể nhập nó từ mô-đun 4252 có tên tương tự hoặc 4254 để triển khai nhanh hơnVá đầu ra tiêu chuẩn từ mô-đun 59 đúng như tên gọi của nó, nhưng bạn cần lưu ý một số vấn đề 36Trước hết, hãy nhớ cài đặt mô-đun 4240 vì nó không có sẵn trong thư viện chuẩn của Python 2Thứ hai, câu lệnh 04 gọi phương thức 79 cơ bản trên đối tượng giả định thay vì gọi chính đối tượng đó. Đó là lý do tại sao bạn sẽ chạy các xác nhận đối với 4259Cuối cùng, một câu lệnh 04 không phải lúc nào cũng tương ứng với một lệnh gọi tới 4261. Trên thực tế, bạn sẽ thấy ký tự xuống dòng được viết riêngTùy chọn cuối cùng bạn có là nhập 66 từ 4263 và vá nó 37Một lần nữa, nó gần giống với Python 3, nhưng hàm 66 được định nghĩa trong mô-đun 4265 thay vì 4266in () Gỡ lỗiTrong phần này, bạn sẽ xem xét các công cụ có sẵn để gỡ lỗi trong Python, bắt đầu từ một hàm khiêm tốn 66, thông qua mô-đun 4268, cho đến một trình gỡ lỗi chính thức. Sau khi đọc nó, bạn sẽ có thể đưa ra quyết định sáng suốt về cách nào phù hợp nhất trong một tình huống nhất địnhtruy tìmCòn được gọi là gỡ lỗi in hoặc gỡ lỗi thượng cổ, đây là hình thức gỡ lỗi cơ bản nhất. Mặc dù hơi lỗi thời nhưng nó vẫn mạnh mẽ và có công dụng của nó Ý tưởng là đi theo đường dẫn thực hiện chương trình cho đến khi chương trình dừng đột ngột hoặc đưa ra kết quả không chính xác để xác định chính xác lệnh có vấn đề. Bạn làm điều đó bằng cách chèn các câu lệnh in với các từ nổi bật ở những nơi được lựa chọn cẩn thận Hãy xem ví dụ này, biểu hiện lỗi làm tròn >>> 38Như bạn có thể thấy, hàm này không trả về giá trị mong muốn là 4269, nhưng bây giờ bạn biết điều đó là do tổng hơi sai. Theo dõi trạng thái của các biến ở các bước khác nhau của thuật toán có thể cho bạn gợi ý về vấn đềTrong trường hợp này, vấn đề nằm ở chỗ số dấu phẩy động được biểu diễn như thế nào trong bộ nhớ máy tính. Hãy nhớ rằng các số được lưu trữ ở dạng nhị phân. Giá trị thập phân của 4269 hóa ra có dạng biểu diễn nhị phân vô hạn, được làm trònĐể biết thêm thông tin về cách làm tròn số trong Python, bạn có thể xem Cách làm tròn số trong Python Phương pháp này đơn giản, trực quan và sẽ hoạt động với hầu hết mọi ngôn ngữ lập trình hiện có. Chưa kể, đó là một bài tập tuyệt vời trong quá trình học tập Mặt khác, một khi bạn nắm vững các kỹ thuật nâng cao hơn, thì rất khó để quay lại, vì chúng cho phép bạn tìm lỗi nhanh hơn nhiều. Truy tìm là một quy trình thủ công tốn nhiều công sức, có thể để lọt nhiều lỗi hơn nữa. Chu kỳ xây dựng và triển khai cần có thời gian. Sau đó, bạn cần nhớ loại bỏ tỉ mỉ tất cả các cuộc gọi 66 mà bạn đã thực hiện mà không vô tình chạm vào cuộc gọi chính hãngBên cạnh đó, nó yêu cầu bạn thực hiện các thay đổi trong mã, điều này không phải lúc nào cũng có thể thực hiện được. Có thể bạn đang gỡ lỗi một ứng dụng đang chạy trong máy chủ web từ xa hoặc muốn chẩn đoán sự cố theo kiểu khám nghiệm tử thi. Đôi khi bạn chỉ đơn giản là không có quyền truy cập vào đầu ra tiêu chuẩn Đó chính xác là nơi khai thác gỗ tỏa sáng ghi nhật kýGiả sử bạn đang điều hành một trang web thương mại điện tử trong một phút. Một ngày nọ, một khách hàng tức giận gọi điện thoại phàn nàn về một giao dịch không thành công và nói rằng anh ta đã mất tiền. Anh ấy tuyên bố đã thử mua một số mặt hàng, nhưng cuối cùng, có một số lỗi khó hiểu khiến anh ấy không thể hoàn thành đơn hàng đó. Tuy nhiên, khi anh ta kiểm tra tài khoản ngân hàng của mình, tiền đã biến mất Bạn chân thành xin lỗi và hoàn tiền, nhưng cũng không muốn điều này lặp lại trong tương lai. Làm thế nào để bạn gỡ lỗi đó? Bất cứ khi nào bạn thấy mình đang gỡ lỗi bản in, hãy cân nhắc biến nó thành thông báo tường trình vĩnh viễn. Điều này có thể hữu ích trong những tình huống như thế này, khi bạn cần phân tích một vấn đề sau khi nó xảy ra, trong một môi trường mà bạn không có quyền truy cập Có những công cụ tinh vi để tổng hợp và tìm kiếm nhật ký, nhưng ở cấp độ cơ bản nhất, bạn có thể coi nhật ký là tệp văn bản. Mỗi dòng truyền tải thông tin chi tiết về một sự kiện trong hệ thống của bạn. Thông thường, nó sẽ không chứa thông tin nhận dạng cá nhân, tuy nhiên, trong một số trường hợp, nó có thể được pháp luật quy định Đây là bảng phân tích của một bản ghi nhật ký điển hình 39Như bạn có thể thấy, nó có dạng cấu trúc. Ngoài một thông báo mô tả, có một số trường có thể tùy chỉnh, cung cấp ngữ cảnh của một sự kiện. Tại đây, bạn có ngày giờ chính xác, cấp nhật ký, tên nhật ký và tên luồng Các cấp nhật ký cho phép bạn lọc tin nhắn nhanh chóng để giảm tiếng ồn. Ví dụ: nếu bạn đang tìm lỗi, bạn không muốn xem tất cả các cảnh báo hoặc thông báo gỡ lỗi. Việc tắt hoặc bật thông báo ở các cấp nhật ký nhất định thông qua cấu hình là chuyện nhỏ mà không cần chạm vào mã Với tính năng ghi nhật ký, bạn có thể giữ các thông báo gỡ lỗi của mình tách biệt với đầu ra tiêu chuẩn. Theo mặc định, tất cả các thông báo nhật ký đều chuyển đến luồng lỗi tiêu chuẩn, có thể hiển thị thuận tiện bằng các màu khác nhau. Tuy nhiên, bạn có thể chuyển hướng thông điệp tường trình sang các tệp riêng biệt, ngay cả đối với các mô-đun riêng lẻ Khá phổ biến, ghi nhật ký bị định cấu hình sai có thể dẫn đến hết dung lượng trên đĩa của máy chủ. Để ngăn chặn điều đó, bạn có thể thiết lập xoay vòng nhật ký, thao tác này sẽ giữ các tệp nhật ký trong một khoảng thời gian nhất định, chẳng hạn như một tuần hoặc khi chúng đạt đến một kích thước nhất định. Tuy nhiên, lưu trữ các nhật ký cũ hơn luôn là một cách thực hành tốt. Một số quy định buộc dữ liệu khách hàng phải được lưu giữ trong vòng 5 năm So với các ngôn ngữ lập trình khác, đăng nhập Python đơn giản hơn vì module 4268 đã được đóng gói với thư viện chuẩn. Bạn chỉ cần nhập và định cấu hình nó chỉ trong hai dòng mã 40Bạn có thể gọi các hàm được xác định ở cấp độ mô-đun, được nối với trình ghi nhật ký gốc, nhưng thực tế phổ biến hơn là lấy một trình ghi nhật ký chuyên dụng cho từng tệp nguồn của bạn 41Ưu điểm của việc sử dụng trình ghi nhật ký tùy chỉnh là kiểm soát chi tiết hơn. Chúng thường được đặt tên theo mô-đun mà chúng được xác định thông qua biến 4273Một lý do cuối cùng để chuyển từ chức năng 66 sang ghi nhật ký là sự an toàn của luồng. Trong phần sắp tới, bạn sẽ thấy rằng phần trước không hoạt động tốt với nhiều luồng thực thigỡ lỗiSự thật là cả truy tìm và ghi nhật ký đều không thể được coi là gỡ lỗi thực sự. Để thực hiện gỡ lỗi thực tế, bạn cần một công cụ gỡ lỗi, cho phép bạn thực hiện các thao tác sau
Trình gỡ lỗi thô chạy trong thiết bị đầu cuối, có tên không ngạc nhiên là 4275 cho “Trình gỡ lỗi Python,” được phân phối như một phần của thư viện chuẩn. Điều này làm cho nó luôn khả dụng, vì vậy nó có thể là lựa chọn duy nhất của bạn để thực hiện gỡ lỗi từ xa. Có lẽ đó là một lý do tốt để làm quen với nóTuy nhiên, nó không đi kèm với giao diện đồ họa nên việc sử dụng 4275 có thể hơi phức tạp. Nếu bạn không thể chỉnh sửa mã, bạn phải chạy mã đó dưới dạng mô-đun và chuyển vị trí tập lệnh của bạn 42Nếu không, bạn có thể thiết lập một điểm ngắt trực tiếp trong mã, điểm dừng này sẽ tạm dừng việc thực thi tập lệnh của bạn và đưa bạn vào trình gỡ lỗi. Cách cũ để làm điều này cần hai bước >>> 43Thao tác này sẽ hiển thị lời nhắc tương tác, thoạt nhìn có vẻ đáng sợ. Tuy nhiên, bạn vẫn có thể nhập Python nguyên gốc vào thời điểm này để kiểm tra hoặc sửa đổi trạng thái của các biến cục bộ. Ngoài ra, thực sự chỉ có một số lệnh dành riêng cho trình gỡ lỗi mà bạn muốn sử dụng để xem qua mã Kể từ Python 3. 7, bạn cũng có thể gọi hàm 4277 tích hợp, thực hiện tương tự nhưng theo cách nhỏ gọn hơn và có thêm một số chuông và còi 44Hầu hết các phần có thể bạn sẽ sử dụng trình gỡ lỗi trực quan được tích hợp với trình chỉnh sửa mã. PyCharm có một trình gỡ lỗi tuyệt vời, tự hào có hiệu suất cao, nhưng bạn sẽ tìm thấy nhiều IDE thay thế có trình gỡ lỗi, cả trả phí và miễn phí Gỡ lỗi không phải là viên đạn bạc thành ngữ. Đôi khi ghi nhật ký hoặc theo dõi sẽ là một giải pháp tốt hơn. Ví dụ: các lỗi khó tái tạo, chẳng hạn như điều kiện chủng tộc, thường là do khớp nối thời gian. Khi bạn dừng tại một điểm dừng, việc tạm dừng nhỏ đó trong quá trình thực thi chương trình có thể che dấu sự cố. Nó giống như nguyên tắc Heisenberg. bạn không thể đo lường và quan sát lỗi cùng một lúc Các phương pháp này không loại trừ lẫn nhau. Họ bổ sung cho nhau In chỉ an toànTrước đây, tôi đã đề cập sơ qua về vấn đề an toàn luồng, khuyến nghị sử dụng 4268 thay vì chức năng 66. Nếu bạn vẫn đang đọc điều này, thì bạn phải cảm thấy thoải mái với khái niệm chủ đềAn toàn luồng có nghĩa là một đoạn mã có thể được chia sẻ an toàn giữa nhiều luồng thực thi. Chiến lược đơn giản nhất để đảm bảo an toàn luồng là chỉ chia sẻ các đối tượng bất biến. Nếu các luồng không thể sửa đổi trạng thái của một đối tượng, thì sẽ không có nguy cơ phá vỡ tính nhất quán của nó Một phương pháp khác tận dụng bộ nhớ cục bộ, làm cho mỗi luồng nhận bản sao của cùng một đối tượng. Bằng cách đó, các luồng khác không thể thấy các thay đổi được thực hiện đối với luồng đó trong luồng hiện tại Nhưng điều đó không giải quyết được vấn đề, phải không? . Cách phổ biến nhất để đồng bộ hóa quyền truy cập đồng thời vào một tài nguyên như vậy là khóa nó. Điều này cho phép truy cập ghi độc quyền vào một hoặc đôi khi một vài luồng tại một thời điểm Tuy nhiên, khóa đắt tiền và làm giảm thông lượng đồng thời, vì vậy các phương tiện khác để kiểm soát quyền truy cập đã được phát minh, chẳng hạn như các biến nguyên tử hoặc thuật toán so sánh và hoán đổi In không an toàn theo luồng trong Python. Hàm 66 giữ tham chiếu đến đầu ra tiêu chuẩn, là biến toàn cục được chia sẻ. Về lý thuyết, do không có khóa nên việc chuyển đổi ngữ cảnh có thể xảy ra trong khi gọi tới 4261, đan xen các bit văn bản từ nhiều lệnh gọi 66Tuy nhiên, trong thực tế, điều đó không xảy ra. Cho dù bạn có cố gắng thế nào, việc ghi vào đầu ra tiêu chuẩn dường như là nguyên tử. Vấn đề duy nhất mà đôi khi bạn có thể quan sát thấy là việc ngắt dòng bị lộn xộn 45Để mô phỏng điều này, bạn có thể tăng khả năng chuyển ngữ cảnh bằng cách đặt phương thức 79 cơ bản ở chế độ ngủ trong một khoảng thời gian ngẫu nhiên. Thế nào? 46Trước tiên, bạn cần lưu trữ phương thức gốc 79 trong một biến mà bạn sẽ ủy thác sau này. Sau đó, bạn cung cấp triển khai giả của mình, sẽ mất tối đa một giây để thực thi. Mỗi luồng sẽ thực hiện một vài cuộc gọi 66 với tên và một chữ cái. A, B và CNếu bạn đã đọc phần mô phỏng trước đó, thì bạn có thể đã biết tại sao việc in lại hoạt động sai như vậy. Tuy nhiên, để làm cho nó rõ ràng, bạn có thể nắm bắt các giá trị được đưa vào hàm 4286 của mình. Bạn sẽ nhận thấy rằng bạn nhận được một trình tự hơi khác mỗi lần 47Mặc dù bản thân 4261 là một phép toán nguyên tử, nhưng một lần gọi hàm 66 có thể mang lại nhiều hơn một lần ghi. Ví dụ: ngắt dòng được viết riêng biệt với phần còn lại của văn bản và chuyển đổi ngữ cảnh diễn ra giữa các lần viết đóBạn có thể làm cho ký tự xuống dòng trở thành một phần không thể thiếu của tin nhắn bằng cách xử lý thủ công 48Điều này sẽ khắc phục đầu ra 49Tuy nhiên, lưu ý rằng hàm 66 vẫn tiếp tục thực hiện lệnh gọi riêng cho hậu tố trống, điều này chuyển thành lệnh 4290 vô dụng 50Phiên bản thực sự an toàn cho luồng của hàm 66 có thể trông như thế này 51Bạn có thể đặt chức năng đó trong một mô-đun và nhập nó vào nơi khác 52Bây giờ, mặc dù thực hiện hai lần ghi cho mỗi yêu cầu 66, nhưng chỉ một luồng được phép tương tác với luồng, trong khi phần còn lại phải đợi 53Tôi đã thêm nhận xét để cho biết khóa đang giới hạn quyền truy cập vào tài nguyên được chia sẻ như thế nào Ngược lại, mô-đun 4268 được thiết kế an toàn cho luồng, điều này được thể hiện qua khả năng hiển thị tên luồng trong thông báo được định dạng>>> 54Đó là một lý do khác khiến bạn có thể không muốn sử dụng hàm 66 mọi lúcĐối tác in PythonĐến bây giờ, bạn đã biết rất nhiều điều cần biết về 66. Tuy nhiên, chủ đề sẽ không hoàn chỉnh nếu không nói một chút về các đối tác của nó. Trong khi 66 là về đầu ra, thì có các hàm và thư viện cho đầu vàoĐược xây dựng trongPython đi kèm với một chức năng tích hợp sẵn để chấp nhận đầu vào từ người dùng, được gọi là 4297. Nó chấp nhận dữ liệu từ luồng đầu vào tiêu chuẩn, thường là bàn phím>>> 55Hàm luôn trả về một chuỗi, vì vậy bạn có thể cần phân tích cú pháp cho phù hợp 56Tham số dấu nhắc là hoàn toàn tùy chọn, vì vậy sẽ không có gì hiển thị nếu bạn bỏ qua nó, nhưng chức năng vẫn hoạt động >>> 57Tuy nhiên, việc đưa ra lời kêu gọi hành động mang tính mô tả giúp trải nghiệm người dùng tốt hơn rất nhiều Yêu cầu người dùng nhập mật khẩu bằng 4297 là một ý tưởng tồi vì nó sẽ hiển thị ở dạng văn bản gốc khi họ nhập mật khẩu. Trong trường hợp này, bạn nên sử dụng hàm 4299 để che các ký tự đã nhập. Chức năng này được định nghĩa trong một mô-đun có cùng tên, cũng có sẵn trong thư viện tiêu chuẩn>>> 58Mô-đun 8800 có một chức năng khác để lấy tên người dùng từ một biến môi trường>>> 59Các hàm tích hợp của Python để xử lý đầu vào tiêu chuẩn khá hạn chế. Đồng thời, có rất nhiều gói của bên thứ ba cung cấp các công cụ tinh vi hơn nhiều bên thứ baCó các gói Python bên ngoài cho phép xây dựng các giao diện đồ họa phức tạp đặc biệt để thu thập dữ liệu từ người dùng. Một số tính năng của họ bao gồm
Trình diễn các công cụ như vậy nằm ngoài phạm vi của bài viết này, nhưng bạn có thể muốn dùng thử chúng. Cá nhân tôi đã biết về một số trong số đó thông qua Python Bytes Podcast. Họ đây rồi
Tuy nhiên, điều đáng nói là một công cụ dòng lệnh có tên là 8805 bổ sung miễn phí khả năng chỉnh sửa dòng mạnh mẽ cho các tập lệnh Python của bạn. Bạn không phải làm bất cứ điều gì để nó hoạt độngGiả sử bạn đã viết một giao diện dòng lệnh hiểu ba hướng dẫn, bao gồm một hướng dẫn để thêm số 60Thoạt nhìn, nó giống như một lời nhắc điển hình khi bạn chạy nó 61Nhưng ngay khi bạn mắc lỗi và muốn sửa nó, bạn sẽ thấy không có phím chức năng nào hoạt động như mong muốn. Ví dụ: nhấn vào mũi tên Trái sẽ dẫn đến điều này thay vì di chuyển con trỏ trở lại. 62Bây giờ, bạn có thể gói cùng một tập lệnh bằng lệnh 8805. Bạn không chỉ làm cho các phím mũi tên hoạt động mà còn có thể tìm kiếm trong lịch sử liên tục của các lệnh tùy chỉnh của mình, sử dụng tính năng tự động hoàn thành và chỉnh sửa dòng bằng phím tắt 63Điều đó không tuyệt sao? Phần kết luậnBây giờ bạn đã được trang bị một lượng kiến thức về hàm 66 trong Python, cũng như nhiều chủ đề xung quanh. Bạn hiểu sâu về nó là gì và nó hoạt động như thế nào, liên quan đến tất cả các yếu tố chính của nó. Nhiều ví dụ đã cho bạn cái nhìn sâu sắc về sự phát triển của nó từ Python 2Ngoài ra, bạn đã học cách
Bây giờ bạn đã biết tất cả những điều này, bạn có thể tạo các chương trình tương tác giao tiếp với người dùng hoặc tạo dữ liệu ở các định dạng tệp phổ biến. Bạn có thể nhanh chóng chẩn đoán các sự cố trong mã của mình và tự bảo vệ mình khỏi chúng. Cuối cùng nhưng không kém phần quan trọng, bạn biết cách thực hiện trò chơi rắn cổ điển Nếu bạn vẫn khao khát biết thêm thông tin, có câu hỏi hoặc chỉ đơn giản là muốn chia sẻ suy nghĩ của mình, thì hãy liên hệ trong phần bình luận bên dưới Xem ngay Hướng dẫn này có một khóa học video liên quan do nhóm Real Python tạo. Xem nó cùng với hướng dẫn bằng văn bản để hiểu sâu hơn. Hàm print() của Python. Đi xa hơn những điều cơ bản Làm thế nào để bạn viết giữa bằng Python?Cú pháp – phương pháp Python Pandas between() start. Đây là giá trị bắt đầu từ đó kiểm tra bắt đầu. kết thúc. Kiểm tra dừng lại ở giá trị này. bao gồm. Nếu Đúng, nó bao gồm giá trị 'bắt đầu' cũng như 'kết thúc' đã qua để kiểm tra. Nếu được đặt thành 'Sai', nó sẽ loại trừ giá trị 'bắt đầu' và 'kết thúc' khi thực hiện kiểm tra. Làm cách nào để in một số giữa hai số trong Python?Thêm 1 vào num1 để num1 không có trong danh sách num_list. append(i) print(f'Số đầu tiên. {num1}n\Số thứ hai. {num2}') print(f'Các số giữa {num1} và {num2} là. \n{num_list}') ngắt ngoại trừ. print("Đầu vào phải là số. Thử lại. ") Làm cách nào để in một số giữa các chuỗi trong Python?Sử dụng dấu phẩy “,” để phân tách các chuỗi và biến trong khi in int và string trên cùng một dòng trong Python hoặc chuyển đổi int thành chuỗi. Khi thêm chuỗi, chúng nối. Làm cách nào để thêm thời gian giữa các lần in bằng Python?Phương pháp 1. Thời gian sử dụng. . Nhập mô-đun thời gian Để thêm thời gian trễ trong quá trình thực thi, chúng tôi sử dụng hàm sleep() giữa hai câu lệnh mà chúng tôi muốn độ trễ giữa chúng. Trong hàm sleep() truyền tham số dưới dạng số nguyên hoặc giá trị float |