Việc sử dụng các thẻ python tùy chỉnh pyyaml có thể thực hiện điều này mà không cần thêm mã.
//pyyaml.org/wiki/PyYAMLDocumentation#yaml-tags-and-python-types
Đối với ví dụ danh sách trong câu hỏi:
list: !!python/object/apply:numpy.arange [1,5]
Ví dụ về Python làm việc:
import yaml; yaml.load["list: !!python/object/apply:numpy.arange [1,5]", yaml.Loader]
Out[0]: {'list': array[[1, 2, 3, 4]]}
Bạn có thể tận dụng điều này hơn nữa để làm một số điều điên rồ với eval từ tệp yaml. Mã sau đây có thể được sử dụng để biên dịch các chức năng được phát ra từ quá trình xử lý YAML. [Eval thường bị giới hạn trong một câu lệnh]
Ví dụ này hoạt động cho tôi trên Windows Cpython 3.9 với Pyyaml 6.0. [Hack trình biên dịch để rút ra đối tượng mã nội bộ có thể bị hỏng trên một phiên bản khác]
import yaml
s = """"""
y = yaml.load[s, yaml.Loader]
assert y['add_one'][1] == 2
assert not y['is_instance_int']['foo']
assert y['function_result'] == 7
Đầu vào YAML
# this creates a compiler object that can be used to return a compiled function from string code without using exec
# there is some trickiness because we must pass in the builtins module into global list using __builtins__
compile_to_function: &compiler !!python/object/apply:eval
- |
function_type[
# the inner function code is the first code object attached to the outer code in co_consts
[c for c in compile[code, '__dynamic__', 'exec'].co_consts if isinstance[c,code_type]][0],
{'function_type': function_type, 'code_type': code_type, **__builtins__, '__builtins__': __builtins__}
]
- function_type: !!python/name:types.FunctionType
code_type: !!python/name:types.CodeType
code: |
def compile_to_function[code]:
return function_type[[c for c in compile[code, '', 'exec'].co_consts if isinstance[c, code_type]][0], __builtins__]
# some examples of compiling things
add_one: &add_one !!python/object/apply:eval
- compiler[code]
- compiler: *compiler
code: |
def add_one[x]:
x = x + 1
return x
is_instance_int: !!python/object/apply:eval
- compiler[code]
- compiler: *compiler
# note here that isinstance needs the builtins to be present
code: |
def is_instance_int[x]:
return isinstance[x, int]
function_result: !!python/object/apply:eval
- add_one[1*2*3]
- add_one: *add_one
Bài viết này nhằm phác thảo những điều cơ bản của YAML và viết một tập lệnh Python đơn giản đọc chi tiết cấu hình từ tệp YAML.
Yaml là gì?
- Ngôn ngữ đánh dấu YAML AIN là ngôn ngữ tuần tự dữ liệu có thể đọc được của con người [mã hóa các đối tượng thành định dạng khác]
- Nó là một siêu json với các tính năng bổ sung như bình luận, neo, bí danh, v.v.
- Được sử dụng bởi nhiều ngôn ngữ lập trình và đơn giản để thể hiện ánh xạ phức tạp do đó được sử dụng làm ngôn ngữ cấu hình
- Các tệp YAML được tạo với các tiện ích mở rộng.
- Hỗ trợ nhiều tài liệu trong một tệp
Khái niệm cơ bản của Yaml
Cấu trúc của YAML là một cặp giá trị khóa. Khóa là một chuỗi và giá trị có thể là bất kỳ loại. Các loại dữ liệu được hỗ trợ bởi YAML là boolean, chuỗi, số nguyên, float, mảng, từ điển. Thắng của khoảng trắng được sử dụng để biểu thị cấu trúc. YAML xác định loại dựa trên giá trị, sử dụng trích dẫn đơn hoặc đôi trong khi sử dụng các ký tự đặc biệt.
Hình ảnh dưới đây là kết quả của YAML được chuyển đổi thành JSON, các bình luận bị bỏ qua.
Yaml chuyển đổi thành jsonNâng cao yaml
Nâng cao yamlBắt đầu
Chúng tôi sẽ tạo một dự án đơn giản bao gồm một tập lệnh Python đọc chi tiết cấu hình cơ sở dữ liệu từ tệp YAML, một khi kết nối được thiết lập, nó thực hiện các hoạt động CRUD.
1. Cài đặt
- Tải xuống MongoDB và tạo một cơ sở dữ liệu có tên là College, bộ sưu tập có tên Student_info. Cho phép xác thực trên cơ sở dữ liệu.
- Cài đặt thư viện pyyaml
2. Mã
- Config.yml chứa các chi tiết cấu hình cơ sở dữ liệu như URL, cổng, tên người dùng được mã hóa, mật khẩu được mã hóa, tên cơ sở dữ liệu, tên thu thập.
- script.py đọc config.yml và thiết lập kết nối cơ sở dữ liệu và sau đó thực hiện các hoạt động crud
3. Chạy
Chạy tập lệnh.py
Sự kết luận
Trong câu chuyện này, chúng ta đã thấy những điều cơ bản của YAML và tạo ra một dự án đơn giản bao gồm một tập lệnh Python đọc chi tiết cấu hình cơ sở dữ liệu từ một tệp YAML. YAML dễ nhìn hơn về mặt trực quan và các tính năng nâng cao của nó như bình luận, neo, bí danh làm cho nó tốt hơn JSON.
Hy vọng bạn đã hiểu những điều cơ bản của Yaml.
Cảm ơn vì đã đọc!
Trang web GitHub LinkedIn
Bỏ qua nội dung chính
Trình duyệt này không còn được hỗ trợ.
Nâng cấp lên Microsoft Edge để tận dụng các tính năng mới nhất, cập nhật bảo mật và hỗ trợ kỹ thuật.
Nhiệm vụ kịch bản Python
- Bài báo
- 09/08/2022
- 2 phút để đọc
Trong bài viết này
Dịch vụ Azure DevOps
Sử dụng nhiệm vụ này để chạy tập lệnh Python.
Snippet Yaml
# Python script
# Run a Python file or inline script
- task: PythonScript@0
inputs:
#scriptSource: 'filePath' # Options: filePath, inline
#scriptPath: # Required when scriptSource == filePath
#script: # Required when scriptSource == inline
#arguments: # Optional
#pythonInterpreter: # Optional
#workingDirectory: # Optional
#failOnStderr: false # Optional
Tranh luận
scriptSource TypeType | [Yêu cầu] Loại tập lệnh đích: Đường dẫn tệp hoặc nội tuyến |
Đường dẫn scriptPath ScriptScript Path | [Yêu cầu khi scriptSource == filePath ] Đường dẫn của tập lệnh để thực thi. Phải là một đường dẫn đủ điều kiện hoặc liên quan đến $ [System.DefaultWorkingDirectory]. |
script ScriptScript | [Yêu cầu khi scriptSource == 1] Tập lệnh Python để chạy |
2ArgumentArguments | [Tùy chọn] Một chuỗi chứa các đối số được truyền cho tập lệnh. Chúng sẽ có sẵn thông qua 3 như thể bạn đã vượt qua chúng trên dòng lệnh. |
4Python phiên dịchPython interpreter | [Tùy chọn] Đường dẫn tuyệt đối đến trình thông dịch Python để sử dụng. Nếu không được chỉ định, nhiệm vụ giả định một trình thông dịch Python có sẵn trên đường dẫn và chỉ cần cố gắng chạy lệnh 5. |
Thư mục 6Working directory | [Không bắt buộc] |
7Fail về lỗi tiêu chuẩnFail on standard error | [Tùy chọn] Nếu đúng, nhiệm vụ này sẽ thất bại nếu bất kỳ văn bản nào được ghi vào 8. |
Tùy chọn kiểm soát nhiệm vụ
Nhận xét
Theo mặc định, nhiệm vụ này sẽ gọi
import yaml; yaml.load["list: !!python/object/apply:numpy.arange [1,5]", yaml.Loader]
Out[0]: {'list': array[[1, 2, 3, 4]]}
5 từ đường dẫn hệ thống. Chạy sử dụng phiên bản Python để đặt phiên bản bạn muốn vào đường dẫn hệ thống.Mã nguồn mở
Nhiệm vụ này là nguồn mở trên GitHub. Phản hồi và đóng góp được hoan nghênh.
Nhận xét
Gửi và xem phản hồi cho