Con trăn cấu hình yaml

Một ngày nào đó, ai trong chúng ta cũng sẽ chết. Có lẽ chúng ta sẽ ra đi trong ánh hào quang chói lọi, đóng dấu vé của chúng ta sau một cuộc sống sung túc. Thay vào đó, một số người trong chúng ta có thể chết từ bên trong khi rút ra những cọng rơm cuối cùng của một sự nghiệp đi vào ngõ cụt không thể tiếp tục được nữa. Bất kể cái chết của bạn là thể xác hay tình cảm, có một điều chắc chắn là. sếp và đồng nghiệp của bạn sẽ coi bạn là người đã chết đối với họ mãi mãi

Văn hóa công sở duy trì những thành ngữ kỳ lạ, trong đó yêu thích của tôi là câu nói sáo rỗng "bị xe buýt đâm" bất hủ. Mọi công ty đều có những nhân viên kỳ cựu, những người đã tích lũy kiến ​​thức vô giá qua nhiều năm. Khi các công ty ngày càng phụ thuộc vào những người đóng góp này, lòng biết ơn của tổ chức bắt đầu chuyển sang một dạng hoang tưởng. Không ai có thể không tự hỏi. "điều gì sẽ xảy ra nếu nhân viên giỏi nhất của chúng tôi bị xe buýt đâm?"

Tôi đánh giá cao sự công bằng nên thơ của một tổ chức bị bất lực trước nạn bóc lột nhân viên. Điều đó nói rằng, có những lý do khác để đảm bảo mã bạn viết dễ đọc và có thể thực hiện được bởi người khác. Nếu bạn có kế hoạch xây dựng phần mềm tiếp tục tồn tại, bạn sẽ cần bắt đầu bằng cách cấu trúc ứng dụng của mình một cách hợp lý. Hãy bắt đầu với hình vuông. cấu hình dự án

Có rất nhiều loại tệp chúng tôi có thể sử dụng để lưu trữ và truy cập các biến thiết yếu trong suốt dự án của mình. Các loại tệp như ini, yaml và các loại khác đều có những cách lưu trữ thông tin duy nhất trong hệ thống phân cấp có cấu trúc [hoặc không có cấu trúc]. Tùy thuộc vào bản chất dự án của bạn, mỗi cấu trúc tệp này có thể phục vụ tốt cho bạn hoặc cản trở bạn. Chúng ta sẽ xem xét các ưu điểm của tất cả các tùy chọn này và phân tích các cấu hình này bằng các thư viện Python thích hợp của chúng

Gặp gỡ các ứng cử viên

Có nhiều cách để lột da một con mèo, nhưng thậm chí còn có nhiều cách hơn để định dạng tệp cấu hình trong phần mềm hiện đại. Chúng ta sẽ xem xét một số định dạng tệp phổ biến nhất để xử lý cấu hình dự án [ini, toml, yaml, json,. env] và các thư viện Python phân tích chúng

cấu hình từ. ban đầu

ini có lẽ là tệp cấu hình đơn giản nhất có sẵn cho chúng tôi. ini rất phù hợp cho các dự án nhỏ hơn, chủ yếu là do các tệp này chỉ hỗ trợ phân cấp sâu 1 cấp. ini về cơ bản là các tệp phẳng, ngoại trừ các biến có thể thuộc về các nhóm. Ví dụ dưới đây minh họa cách các biến chia sẻ một chủ đề chung có thể thuộc một tiêu đề chung, chẳng hạn như

"""Load configuration from .ini file."""
import configparser                                                     


# Read local file `config.ini`.
config = configparser.ConfigParser[]                                     config.read['settings/config.ini'] 
7 hoặc
"""Load configuration from .ini file."""
import configparser                                                     


# Read local file `config.ini`.
config = configparser.ConfigParser[]                                     config.read['settings/config.ini'] 
8

[APP]
ENVIRONMENT = development
DEBUG = False

[DATABASE]
USERNAME = root
PASSWORD = p@ssw0rd
HOST = 127.0.0.1
PORT = 5432
DB = my_database

[LOGS]
ERRORS = logs/errors.log
INFO = data/info.log

[FILES]
STATIC_FOLDER = static
TEMPLATES_FOLDER = templates
cấu hình. ban đầu

Cấu trúc này chắc chắn làm cho mọi thứ dễ hiểu hơn đối với con người, nhưng tính thực tế của cấu trúc này vượt xa tính thẩm mỹ. Hãy phân tích tệp này bằng thư viện configparser của Python để xem điều gì đang thực sự xảy ra. Chúng tôi bắt đầu bằng cách lưu nội dung của bài kiểm tra. ini thành một biến có tên là config

"""Load configuration from .ini file."""
import configparser                                                     


# Read local file `config.ini`.
config = configparser.ConfigParser[]                                     config.read['settings/config.ini'] 
ini_config. py

Gọi

"""Load configuration from .ini file."""
import configparser                                                     


# Read local file `config.ini`.
config = configparser.ConfigParser[]                                     config.read['settings/config.ini'] 
9 trên tệp ini không chỉ lưu trữ dữ liệu thuần túy; . Hãy thử chạy
0 để tự mình xem

Đầu ra

Các tệp cấu hình tồn tại với mục đích đơn giản là trích xuất các giá trị. configparser cho phép chúng tôi thực hiện việc này theo nhiều cách. Mỗi dòng bên dưới trả về giá trị 127. 0. 0. 1

"""Load configuration from .ini file."""
import configparser                                                     


# Read local `config.ini` file.
config = configparser.ConfigParser[]                                     config.read['settings/config.ini'] 

# Get values from our .ini file
config.get['DATABASE', 'HOST']
config['DATABASE']['HOST'] 
ini_config. py

Đối với các giá trị mà chúng tôi mong muốn nhận được một loại dữ liệu cụ thể, configparser có một số phương pháp kiểm tra loại để truy xuất các giá trị trong cấu trúc dữ liệu mà chúng tôi đang tìm kiếm. Lệnh

1 sẽ trả về chính xác giá trị boolean là Sai thay vì chuỗi có nội dung "Sai", điều này rõ ràng sẽ gây ra sự cố cho ứng dụng của chúng ta. Nếu giá trị của chúng tôi
2 được đặt thành một giá trị khác không phải là boolean, thì
3 sẽ báo lỗi. configparser có một loạt các phương thức kiểm tra kiểu khác, chẳng hạn như
4,
5, v.v.

Các tính năng của  configparser không dừng lại ở đó. Chúng ta có thể đi vào chi tiết về khả năng viết các giá trị cấu hình mới của thư viện, kiểm tra sự tồn tại của các khóa, v.v., nhưng chúng ta đừng

cấu hình từ. toml

Thoạt nhìn, các tệp TOML có vẻ giống một số điểm tương đồng về cú pháp với các tệp ini, nhưng hỗ trợ nhiều loại dữ liệu hơn, cũng như các mối quan hệ giữa chính các giá trị. Các tệp TOML cũng buộc chúng tôi phải rõ ràng hơn về cấu trúc dữ liệu trước, trái ngược với việc xác định chúng sau khi phân tích cú pháp như trình cấu hình.

Phân tích cú pháp các tệp TOML trong Python được xử lý bởi một thư viện có tên thích hợp là toml. Trước khi chúng tôi đến đó, hãy xem cường điệu về TOML là gì

Các loại biến TOML

Các tệp TOML xác định các biến thông qua các cặp khóa/giá trị theo cách tương tự như các tệp ini. Các cặp này được gọi là khóa. Tuy nhiên, không giống như các tệp ini, TOML hy vọng rằng các giá trị của khóa sẽ được lưu trữ dưới dạng kiểu dữ liệu mà chúng dự định sẽ được sử dụng làm. Các biến dự định được phân tích cú pháp dưới dạng chuỗi phải được lưu trữ dưới dạng giá trị trong dấu ngoặc kép, trong khi phép toán luận phải được lưu trữ dưới dạng giá trị đúng hoặc sai thô. Điều này loại bỏ rất nhiều sự mơ hồ xung quanh cấu hình của chúng tôi. chúng tôi không cần các phương thức như

6 với các tệp TOML

Các tệp TOML có thể hỗ trợ một danh mục các loại biến ấn tượng. Một số loại biến TOML ấn tượng hơn bao gồm DateTime, local time, mảng, float và thậm chí cả giá trị thập lục phân

"""Load configuration from .ini file."""
import configparser                                                     


# Read local file `config.ini`.
config = configparser.ConfigParser[]                                     config.read['settings/config.ini'] 
4config. toml

Cấu trúc tệp TOML

Các phần được đặt trong ngoặc trong tệp TOML được gọi là bảng. Các khóa có thể tồn tại bên trong hoặc bên ngoài bảng, như chúng ta có thể thấy trong ví dụ bên dưới. Bạn sẽ nhận thấy rằng đây không phải là hai thành phần duy nhất của tệp TOML.

"""Load configuration from .ini file."""
import configparser                                                     


# Read local file `config.ini`.
config = configparser.ConfigParser[]                                     config.read['settings/config.ini'] 
5config. toml

TOML hỗ trợ khái niệm "các bảng lồng nhau", như đã thấy trong bảng

7, trước nhiều bảng phụ. Sử dụng ký hiệu dấu chấm cho phép chúng tôi tạo liên kết của các bảng, ngụ ý rằng chúng là các phiên bản khác nhau của cùng một phần tử

Ấn tượng không kém là khái niệm "mảng bảng", điều đang xảy ra với

8. Các bảng trong ngoặc kép được tự động thêm vào một mảng, trong đó mỗi mục trong mảng là một bảng có cùng tên. Cách tốt nhất để hình dung những gì đang xảy ra ở đây là tương đương với JSON

"""Load configuration from .ini file."""
import configparser                                                     


# Read local file `config.ini`.
config = configparser.ConfigParser[]                                     config.read['settings/config.ini'] 
8config. json

Phân tích cú pháp TOML

Đủ về TOML làm tiêu chuẩn, hãy lấy dữ liệu của chúng tôi

"""Load configuration from .ini file."""
import configparser                                                     


# Read local file `config.ini`.
config = configparser.ConfigParser[]                                     config.read['settings/config.ini'] 
9toml_config. py

Tải các tệp TOML ngay lập tức trả về một từ điển

[APP]
ENVIRONMENT = development
DEBUG = False

[DATABASE]
USERNAME = root
PASSWORD = p@ssw0rd
HOST = 127.0.0.1
PORT = 5432
DB = my_database

[LOGS]
ERRORS = logs/errors.log
INFO = data/info.log

[FILES]
STATIC_FOLDER = static
TEMPLATES_FOLDER = templates
0Python dict được phân tích cú pháp từ
9

Lấy các giá trị từ cấu hình dễ dàng như làm việc với bất kỳ từ điển nào

[APP]
ENVIRONMENT = development
DEBUG = False

[DATABASE]
USERNAME = root
PASSWORD = p@ssw0rd
HOST = 127.0.0.1
PORT = 5432
DB = my_database

[LOGS]
ERRORS = logs/errors.log
INFO = data/info.log

[FILES]
STATIC_FOLDER = static
TEMPLATES_FOLDER = templates
2toml_config. py

cấu hình từ. khoai mỡ

Các định dạng tệp YAML đã trở thành một định dạng yêu thích của đám đông đối với các cấu hình, có lẽ vì tính dễ đọc của chúng. Những người quen thuộc với đặc tả YAML sẽ cho bạn biết rằng YAML không phải là một định dạng tệp thanh lịch, nhưng điều này không ngăn được bất kỳ ai

Các tệp YAML sử dụng khoảng trắng để xác định cấu trúc phân cấp biến, điều này dường như đã gây được tiếng vang với nhiều nhà phát triển. Kiểm tra cấu hình YAML mẫu có thể trông như thế nào

"""Load configuration from .ini file."""
import configparser                                                     


# Read local file `config.ini`.
config = configparser.ConfigParser[]                                     config.read['settings/config.ini'] 
0config. khoai mỡ

Rõ ràng là các cấu hình YAML rất dễ viết và dễ hiểu. Tệp YAML ở trên có thể thực hiện cùng loại phân cấp phức tạp mà chúng ta đã thấy trong tệp TOML của mình. Tuy nhiên, chúng ta không cần thiết lập rõ ràng các kiểu dữ liệu của biến, cũng như không cần dành thời gian để hiểu các khái niệm như bảng hoặc mảng của bảng. Người ta có thể dễ dàng lập luận rằng tính dễ sử dụng của YAML không biện minh cho những nhược điểm. Đừng dành quá nhiều thời gian để suy nghĩ về điều này. chúng ta đang nói về tập tin cấu hình ở đây

Tôi nghĩ rằng tất cả chúng ta đều có thể đồng ý rằng YAML chắc chắn đánh bại cấu hình JSON. Đây là cấu hình tương tự như trên dưới dạng tệp JSON

"""Load configuration from .ini file."""
import configparser                                                     


# Read local file `config.ini`.
config = configparser.ConfigParser[]                                     config.read['settings/config.ini'] 
1cấu hình. json

Chỉ cho tôi ai đó thích JSON hơn YAML, và tôi sẽ chỉ cho bạn một kẻ bạo dâm từ chối khóa nhà cung cấp của họ với AWS

Phân tích cú pháp YAML trong Python

Tôi đề xuất thư viện Python Confuse [tên gói chắc chắn sẽ khiến nhóm bảo mật thông tin của công ty bạn phải nhướng mày]

Confuse cho phép chúng ta tương tác với các tệp YAML theo cách gần giống với cách chúng ta làm với JSON. Ngoại lệ cho điều này là thư viện nhầm lẫn cần chỉ định

"""Load configuration from .ini file."""
import configparser                                                     


# Read local `config.ini` file.
config = configparser.ConfigParser[]                                     config.read['settings/config.ini'] 

# Get values from our .ini file
config.get['DATABASE', 'HOST']
config['DATABASE']['HOST'] 
0 trên một khóa để trích xuất giá trị của nó, như vậy

"""Load configuration from .ini file."""
import configparser                                                     


# Read local file `config.ini`.
config = configparser.ConfigParser[]                                     config.read['settings/config.ini'] 
2yaml_config. py

get[] có thể chấp nhận một giá trị kiểu dữ liệu như int. Làm như vậy đảm bảo rằng giá trị mà chúng tôi nhận được thực sự là của lược đồ mà chúng tôi đang mong đợi, đây là một tính năng gọn gàng

Trình xác nhận

Tài liệu của Confuse nêu chi tiết các phương thức xác thực bổ sung cho các giá trị mà chúng tôi lấy từ các tệp YAML. Các phương thức như

"""Load configuration from .ini file."""
import configparser                                                     


# Read local `config.ini` file.
config = configparser.ConfigParser[]                                     config.read['settings/config.ini'] 

# Get values from our .ini file
config.get['DATABASE', 'HOST']
config['DATABASE']['HOST'] 
1,
"""Load configuration from .ini file."""
import configparser                                                     


# Read local `config.ini` file.
config = configparser.ConfigParser[]                                     config.read['settings/config.ini'] 

# Get values from our .ini file
config.get['DATABASE', 'HOST']
config['DATABASE']['HOST'] 
2 và
"""Load configuration from .ini file."""
import configparser                                                     


# Read local `config.ini` file.
config = configparser.ConfigParser[]                                     config.read['settings/config.ini'] 

# Get values from our .ini file
config.get['DATABASE', 'HOST']
config['DATABASE']['HOST'] 
3 về cơ bản thực hiện những gì bạn mong muốn chúng thực hiện

Cấu hình CLI

Sự nhầm lẫn cũng xâm nhập vào lĩnh vực xây dựng CLI, cho phép chúng tôi sử dụng tệp YAML của mình để thông báo các đối số có thể được chuyển đến CLI và các giá trị tiềm năng của chúng

"""Load configuration from .ini file."""
import configparser                                                     


# Read local file `config.ini`.
config = configparser.ConfigParser[]                                     config.read['settings/config.ini'] 
3cli_config. py

Có rất nhiều thứ bạn có thể phát điên với ở đây

cấu hình từ. env

Biến môi trường là một cách tuyệt vời để giữ thông tin nhạy cảm ra khỏi cơ sở mã dự án của bạn. Chúng ta có thể lưu trữ các biến môi trường theo nhiều cách khác nhau, cách dễ nhất là thông qua dòng lệnh

"""Load configuration from .ini file."""
import configparser                                                     


# Read local file `config.ini`.
config = configparser.ConfigParser[]                                     config.read['settings/config.ini'] 
4xuất MY_VARIABLE

Các biến được lưu trữ theo cách này sẽ chỉ tồn tại chừng nào phiên cuối cùng hiện tại của bạn còn mở, vì vậy điều này không giúp chúng tôi nhiều ngoài thử nghiệm. Nếu chúng tôi muốn

"""Load configuration from .ini file."""
import configparser                                                     


# Read local `config.ini` file.
config = configparser.ConfigParser[]                                     config.read['settings/config.ini'] 

# Get values from our .ini file
config.get['DATABASE', 'HOST']
config['DATABASE']['HOST'] 
4 tồn tại, chúng tôi có thể thêm dòng
"""Load configuration from .ini file."""
import configparser                                                     


# Read local `config.ini` file.
config = configparser.ConfigParser[]                                     config.read['settings/config.ini'] 

# Get values from our .ini file
config.get['DATABASE', 'HOST']
config['DATABASE']['HOST'] 
5 ở trên vào. bash_profile [hoặc tương đương] để đảm bảo
"""Load configuration from .ini file."""
import configparser                                                     


# Read local `config.ini` file.
config = configparser.ConfigParser[]                                     config.read['settings/config.ini'] 

# Get values from our .ini file
config.get['DATABASE', 'HOST']
config['DATABASE']['HOST'] 
4 sẽ luôn tồn tại trên toàn hệ thống

Các biến cụ thể của dự án phù hợp hơn cho. env nằm trong thư mục dự án của chúng tôi. VÌ TÌNH YÊU THIÊN CHÚA, ĐỪNG CAM KẾT CÁC TỆP NÀY CHO GITHUB

Giả sử chúng ta có một. env với các biến liên quan đến dự án như vậy

"""Load configuration from .ini file."""
import configparser                                                     


# Read local file `config.ini`.
config = configparser.ConfigParser[]                                     config.read['settings/config.ini'] 
5. env

Bây giờ chúng ta có thể trích xuất các giá trị này trong Python bằng cách sử dụng

"""Load configuration from .ini file."""
import configparser                                                     


# Read local `config.ini` file.
config = configparser.ConfigParser[]                                     config.read['settings/config.ini'] 

# Get values from our .ini file
config.get['DATABASE', 'HOST']
config['DATABASE']['HOST'] 
7 tích hợp sẵn

"""Load configuration from .ini file."""
import configparser                                                     


# Read local file `config.ini`.
config = configparser.ConfigParser[]                                     config.read['settings/config.ini'] 
6env_config. py

Chỉ cần sử dụng những gì bạn muốn

Rõ ràng có rất nhiều cách để thiết lập các biến môi trường và dự án trong Python. Chúng tôi có thể dành cả ngày để phân tích ưu và nhược điểm của các loại tệp cấu hình. Đây là một khía cạnh của cuộc sống mà chúng ta chắc chắn không muốn lật đổ

Bên cạnh đó, tôi cần phải suy nghĩ về cuộc sống của tôi. Tôi vừa viết hai nghìn từ về ưu và nhược điểm của các tệp cấu hình, điều mà tôi thà quên đi trước khi nhận ra cuộc sống của mình vô nghĩa như thế nào

Chủ Đề