Làm thế nào để bạn tạo một trình tạo mã trong python?

Cog là một công cụ tạo mã đơn giản được viết bằng Python. Chúng tôi sử dụng nó hoặc kết quả của nó mỗi ngày trong quá trình sản xuất Kubi

Kubi là một hệ thống cộng tác được thể hiện trong một số sản phẩm khác nhau. Chúng tôi có một lược đồ mô tả việc thể hiện dữ liệu cộng tác của khách hàng. chủ đề thảo luận, tài liệu, sự kiện lịch, v.v. Dữ liệu này phải được xử lý theo nhiều cách. được lưu trữ trong một số kho lưu trữ dữ liệu khác nhau, được vận chuyển qua mạng dưới dạng biểu diễn XML, được thao tác trong bộ nhớ bằng cách sử dụng các đối tượng C++ truyền thống, được trình bày để gỡ lỗi và lập luận để đánh giá tính hợp lệ của dữ liệu, để đặt tên cho một số

Chúng tôi cần một cách để mô tả lược đồ này một lần và sau đó tạo mã thực thi một cách đáng tin cậy từ nó

Con đường khó khăn với C ++

Lần triển khai đầu tiên của chúng tôi về lược đồ này liên quan đến một tập hợp các biểu diễn bị gãy. Mô-đun giao thức XML có các bảng mô tả tuần tự hóa và giải tuần tự hóa các luồng XML. Các mô-đun lưu trữ có các bảng khác mô tả ánh xạ từ đĩa sang cấu trúc bộ nhớ. Mô-đun xác thực có các bảng riêng chứa các quy tắc về thuộc tính nào phải có trên mục nào. Các đối tượng trong bộ nhớ có getters và setters cho từng thuộc tính

Nó hoạt động, theo mốt, nhưng đang trở nên không thể quản lý được. Việc thêm thuộc tính mới vào lược đồ yêu cầu chỉnh sửa mười bảng ở các định dạng khác nhau trong nhiều tệp nguồn, cũng như thêm getters và setters cho thuộc tính mới. Không có thẩm quyền duy nhất trong mã cho toàn bộ lược đồ. Các khía cạnh khác nhau của lược đồ được thể hiện theo những cách khác nhau trong các tệp khác nhau

Chúng tôi đã cố gắng đơn giản hóa mớ hỗn độn bằng cách sử dụng macro C++. Điều này đã làm việc ở một mức độ, nhưng vẫn còn khó quản lý. Biểu diễn lược đồ bị cản trở bởi tính chất đơn giản của macro C++ và khả năng mở rộng là vô cùng hạn chế

Các bảng lược đồ không thể tạo bằng các macro nguyên thủy này vẫn được soạn thảo và chỉnh sửa bằng tay. Thay đổi một thuộc tính trong lược đồ vẫn có nghĩa là chạm vào hàng tá tệp. Điều này là tẻ nhạt và dễ bị lỗi. Thiếu một nơi có thể gây ra một lỗi mà sẽ không được chú ý trong nhiều ngày

Tìm kiếm một cách tốt hơn

Rõ ràng là chúng tôi cần một cách tốt hơn để quản lý lược đồ thuộc tính. Không chỉ những sửa đổi hiện có khó khăn, mà các lĩnh vực phát triển mới sẽ yêu cầu những cách sử dụng lược đồ mới và các loại sửa đổi mới thậm chí còn khó khăn hơn

Chúng tôi đã sử dụng các macro C++ để cố gắng biến một mô tả khai báo của lược đồ thành mã thực thi. Cách tốt hơn để làm điều đó là tạo mã. một chương trình viết chương trình. Chúng ta có thể sử dụng một công cụ để đọc lược đồ và tạo mã C++, sau đó biên dịch mã đã tạo đó vào sản phẩm

Chúng tôi cần một cách để đọc tệp mô tả lược đồ và xuất các đoạn mã có thể được tích hợp vào các nguồn C++ của chúng tôi để được biên dịch với phần còn lại của sản phẩm

Thay vì viết một chương trình cụ thể cho vấn đề của chúng tôi, thay vào đó, tôi đã chọn viết một công cụ tạo mã có mục đích chung, mặc dù đơn giản. Nó sẽ giải quyết vấn đề quản lý các đoạn mã trình tạo nhỏ rải rác trong một tập hợp lớn các tệp. Sau đó, chúng tôi có thể sử dụng công cụ có mục đích chung này để giải quyết vấn đề tạo cụ thể của mình

Công cụ tôi đã viết được gọi là Cog. Yêu cầu của nó là

  • Chúng tôi cần có khả năng thực hiện tính toán thú vị trên lược đồ để tạo mã mà chúng tôi cần. Cog sẽ phải cung cấp một ngôn ngữ mạnh mẽ để viết các trình tạo mã trong. Một ngôn ngữ hiện có sẽ giúp các nhà phát triển bắt đầu sử dụng Cog dễ dàng hơn
  • Tôi muốn các nhà phát triển có thể thay đổi lược đồ, sau đó chạy công cụ mà không cần phải hiểu sự phức tạp của việc tạo mã. Cog sẽ phải làm cho việc kết hợp các đoạn mã được tạo với phần còn lại của nguồn C++ trở nên đơn giản và việc chạy Cog để tạo mã cuối cùng sẽ trở nên đơn giản
  • Công cụ không nên quan tâm đến ngôn ngữ của tệp máy chủ. Ban đầu chúng tôi muốn tạo các tệp C++, nhưng chúng tôi đã phân nhánh sang các ngôn ngữ khác. Quá trình tạo phải là một quá trình văn bản thuần túy, không liên quan đến việc giải thích cuối cùng của văn bản đó
  • Vì giản đồ sẽ thay đổi không thường xuyên, nên việc tạo mã phải là hoạt động trong thời gian chỉnh sửa, thay vì hoạt động trong thời gian xây dựng. Điều này giúp tránh phải chạy trình tạo mã như một phần của quá trình xây dựng và có nghĩa là mã được tạo sẽ có sẵn cho IDE và trình gỡ lỗi của chúng tôi

Tạo mã với Python

Tất nhiên, ngôn ngữ tôi chọn cho trình tạo mã là Python. Tính đơn giản và sức mạnh của nó là hoàn hảo cho công việc đọc tệp dữ liệu và tạo mã. Để đơn giản hóa việc tích hợp với mã C++, trình tạo Python được chèn trực tiếp vào tệp C++ dưới dạng nhận xét

Cog đọc một tệp văn bản [C++ trong trường hợp của chúng tôi], tìm kiếm các phần văn bản được đánh dấu đặc biệt mà nó sẽ sử dụng làm trình tạo. Nó thực thi các phần đó dưới dạng mã Python, thu được kết quả đầu ra. Đầu ra sau đó được ghép vào tệp theo mã trình tạo

Vì mã trình tạo và đầu ra của nó đều được lưu trong tệp nên không có sự phân biệt giữa tệp đầu vào và tệp đầu ra. Cog đọc và ghi cùng một tệp và có thể chạy đi chạy lại mà không làm mất thông tin

Cog xử lý các tệp văn bản, chuyển đổi các phần được đánh dấu đặc biệt của tệp thành nội dung mới mà không làm ảnh hưởng đến phần còn lại của tệp hoặc các phần mà nó thực thi để tạo ra nội dung được tạo. Phóng to

Ngoài việc thực thi các trình tạo Python, bản thân Cog được viết bằng Python. Bản chất động của Python khiến việc thực thi mã Python mà Cog tìm thấy trở nên đơn giản và tính linh hoạt của nó giúp thực thi nó trong một môi trường được xây dựng phù hợp để có được ngữ nghĩa mong muốn. Phần lớn mã của Cog liên quan đến việc thụt đầu dòng chính xác. Tôi muốn tác giả có thể tổ chức mã trình tạo của mình trông đẹp mắt trong tệp máy chủ và tạo mã được tạo cũng trông đẹp mắt mà không phải lo lắng về các vấn đề về khoảng trắng khó sử dụng

Tích hợp cấp hệ điều hành của Python cho phép tôi thực thi các lệnh trình bao khi cần. Chúng tôi sử dụng Perforce để kiểm soát nguồn, giữ cho các tệp ở chế độ chỉ đọc cho đến khi chúng cần được chỉnh sửa. Khi chạy Cog có thể cần thay đổi các file mà developer chưa chỉnh sửa. Nó có thể thực thi lệnh shell để kiểm tra các tệp ở chế độ chỉ đọc

Cuối cùng, chúng tôi đã sử dụng XML cho mô tả lược đồ thuộc tính mới của mình và rất nhiều thư viện xử lý XML khác nhau của Python đã giúp việc phân tích cú pháp XML trở nên nhanh chóng

Một ví dụ

Đây là một ví dụ cụ thể nhưng hơi giả tạo. Các thuộc tính được mô tả trong một tệp XML


        
        
        
        

Chúng ta có thể viết một tệp C++ với mã Python nội tuyến

// SchemaPropEnum.h
enum SchemaPropEnum {
        /* [[[cog
        import cog, handyxml
        for p in handyxml.xpath['Properties.xml', '//property']:
                cog.outl["Property%s," % p.name]
        ]]] */
        // [[[end]]]
};

Sau khi chạy tệp này qua Cog, nó trông như thế này

// SchemaPropEnum.h
enum SchemaPropEnum {
        /* [[[cog
        import cog, handyxml
        for p in handyxml.xpath['Properties.xml', '//property']:
                cog.outl["Property%s," % p.name]
        ]]] */
        PropertyId,
        PropertyRevNum,
        PropertySubject,
        PropertyModDate,
        // [[[end]]]
};

Các dòng có dấu ngoặc ba là các dòng đánh dấu phân định các phần mà Cog quan tâm. Văn bản giữa các dòng [[[cog và ]]] là mã Python của trình tạo. Văn bản giữa ]]] và [[[end]]] là kết quả từ lần chạy cuối cùng của Cog [nếu có]. Đối với mỗi đoạn mã trình tạo mà nó tìm thấy, Cog sẽ

  1. loại bỏ đầu ra từ lần chạy cuối cùng,
  2. thực thi mã trình tạo,
  3. nắm bắt đầu ra, từ bánh răng. cuộc gọi outl, và
  4. chèn đầu ra trở lại phần đầu ra

Làm thế nào nó làm việc ra

Trong một từ, tuyệt vời. Bây giờ chúng tôi có một công cụ mạnh mẽ cho phép chúng tôi duy trì một tệp XML duy nhất mô tả lược đồ dữ liệu của chúng tôi. Các nhà phát triển thay đổi lược đồ có một công cụ đơn giản để chạy tạo mã từ lược đồ, tạo mã đầu ra bằng bốn ngôn ngữ khác nhau trên 50 tệp

Nơi mà chúng tôi từng sử dụng một quy trình lặp đi lặp lại và tăng nặng không phù hợp với nhu cầu của chúng tôi, giờ đây chúng tôi có một quy trình tự động cho phép các nhà phát triển thể hiện bản thân và để Cog thực hiện công việc khó khăn đó

Tính linh hoạt và sức mạnh của Python được đưa vào hoạt động theo hai cách. để tự phát triển Cog và rải khắp mã nguồn C++ của chúng tôi để cung cấp cho các nhà phát triển của chúng tôi một công cụ mạnh mẽ để biến dữ liệu tĩnh thành mã chạy

Mặc dù sản phẩm của chúng tôi được xây dựng bằng C++ nhưng chúng tôi đã sử dụng Python để tăng năng suất và sức mạnh biểu đạt, giảm bớt công việc bảo trì và tự động hóa các tác vụ dễ xảy ra lỗi. Phần mềm vận chuyển của chúng tôi được xây dựng hàng ngày với Python làm việc chăm chỉ ở hậu trường

Thông tin thêm và bản thân Cog có tại http. //www. nedbatchelder. com/mã/cog

Giới thiệu về tác giả

Ned Batchelder là một nhà phát triển phần mềm chuyên nghiệp, người đã phải vật lộn với C++, sử dụng Python để giảm bớt khó khăn mỗi khi có cơ hội. Một dự án trước đây của anh ấy, Thế giới của Nat *là chủ đề của Câu chuyện thành công Python trước đó. *

Làm cách nào để tạo tập lệnh Python?

Tạo tệp Python .
Trong cửa sổ công cụ Dự án, chọn gốc dự án [thông thường, đó là nút gốc trong cây dự án], nhấp chuột phải vào dự án và chọn Tệp. Mới mẻ
Chọn tùy chọn Tệp Python từ menu ngữ cảnh, sau đó nhập tên tệp mới. PyCharm tạo một tệp Python mới và mở nó để chỉnh sửa

Làm cách nào để tạo mã C từ Python?

Csnake là gói Python 3 giúp bạn tạo mã C từ Python . Csnake cung cấp cho bạn API nhất quán và có ý kiến ​​giúp bạn cấu trúc mã Python tạo C của mình. Nó làm như vậy bằng cách cung cấp các lớp và hàm để tạo mọi cấu trúc ngôn ngữ C.

Làm cách nào để tạo mã trình tạo mật khẩu trong Python?

Dự án Python tạo mật khẩu bảo mật cao. .
nhập ngẫu nhiên. .
in [chuỗi. in được].
char_seq = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ. #$.
print["Nhập độ dài yêu cầu của mật khẩu từ 8 đến 16. "].
nếu chiều dài >= 8 và chiều dài

Chủ Đề