Quản lý cấu hình Python

Có rất nhiều cách để duy trì cấu hình trong dự án Python. Gần đây tôi đã học được cách làm theo cách không phải là điều gì mới mà tôi đã tìm thấy, nhưng nó mới đối với tôi. Tôi sẽ thảo luận về quá trình phát triển của mình từ các hằng số mã hóa cứng cơ bản trong một dự án sang phương pháp mới này

Trước tiên hãy xem xét một ứng dụng ví dụ trong đó có hai bước, mỗi bước đọc tệp đầu vào và ghi vào tệp đầu ra. Ứng dụng này cũng sẽ sử dụng API mà chúng tôi cần sử dụng khóa bí mật API. Trước tiên, chúng tôi sẽ tạo đối tượng API bằng khóa API. Ở bước 1 chúng ta sẽ load dữ liệu sau đó chuyển qua API để lấy kết quả sau đó lưu kết quả. Trong bước tiếp theo, chúng tôi sẽ tải kết quả API đã lưu, xử lý và lưu kết quả mới. Đây là mã python triển khai logic này trong

import myapi
import utils

from pathlib import Path

API_SECRET_KEY = "SECRET_IS_THERE_IS_NO_SECRET"
myapi_obj = myapi[API_SECRET_KEY]

data_dir = Path["./data/"]
STEP1_IN_F = data_dir / "1_infile.csv"
STEP1_OUT_F = data_dir / "1_outfile.csv"
STEP2_OUT_F = data_dir / "2_outfile.csv"

# step 1
step1_data = utils.load_data[STEP1_IN_F]
step1_out = myapi_obj.process[step1_data]
utils.save_data[step1_out, STEP1_OUT_F]

# step 2
step2_out = utils.process[step1_out]
utils.save_data[step2_out, STEP2_OUT_F]
1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import myapi
import utils

from pathlib import Path

API_SECRET_KEY = "SECRET_IS_THERE_IS_NO_SECRET"
myapi_obj = myapi[API_SECRET_KEY]

data_dir = Path["./data/"]
STEP1_IN_F = data_dir / "1_infile.csv"
STEP1_OUT_F = data_dir / "1_outfile.csv"
STEP2_OUT_F = data_dir / "2_outfile.csv"

# step 1
step1_data = utils.load_data[STEP1_IN_F]
step1_out = myapi_obj.process[step1_data]
utils.save_data[step1_out, STEP1_OUT_F]

# step 2
step2_out = utils.process[step1_out]
utils.save_data[step2_out, STEP2_OUT_F]

Đoạn mã trên sẽ hoạt động tốt và trên thực tế, nếu kích thước mã thực tế là như vậy thì việc giữ các giá trị mã hóa cứng thực sự tốt. Bỏ vấn đề đó sang một bên, một số lý do tại sao nên tránh các giá trị mã hóa cứng là:

  • Các dự án hiếm khi nhỏ như vậy và do đó, chúng sẽ có nhiều hằng số được mã hóa cứng như vậy
  • Bằng cách giữ bí mật được mã hóa cứng [ví dụ:. ,
    import myapi
    import utils
    
    from pathlib import Path
    
    API_SECRET_KEY = "SECRET_IS_THERE_IS_NO_SECRET"
    myapi_obj = myapi[API_SECRET_KEY]
    
    data_dir = Path["./data/"]
    STEP1_IN_F = data_dir / "1_infile.csv"
    STEP1_OUT_F = data_dir / "1_outfile.csv"
    STEP2_OUT_F = data_dir / "2_outfile.csv"
    
    # step 1
    step1_data = utils.load_data[STEP1_IN_F]
    step1_out = myapi_obj.process[step1_data]
    utils.save_data[step1_out, STEP1_OUT_F]
    
    # step 2
    step2_out = utils.process[step1_out]
    utils.save_data[step2_out, STEP2_OUT_F]
    
    2] bên trong tệp chính, chúng tôi có nguy cơ đặt chúng ở chế độ công khai bằng cách vô tình đẩy chúng vào hệ thống kiểm soát phiên bản [e. g. , Github]
  • Nếu các bước 1 và 2 có nhiều mô-đun hơn [được xác định trong các mô-đun khác nhau] và tệp chính này chỉ dán chúng lại với nhau, bạn sẽ xử lý cấu hình như thế nào?
    • Nếu bạn xác định các hằng số này trong từng mô-đun riêng lẻ, bạn sẽ tạo ra mã trùng lặp. Bạn sẽ dễ mắc lỗi hơn nếu bỏ lỡ dù chỉ một thay đổi. Bạn sẽ kém hiệu quả hơn. Hãy tưởng tượng chỉnh sửa tệp
      import myapi
      import utils
      
      from pathlib import Path
      
      API_SECRET_KEY = "SECRET_IS_THERE_IS_NO_SECRET"
      myapi_obj = myapi[API_SECRET_KEY]
      
      data_dir = Path["./data/"]
      STEP1_IN_F = data_dir / "1_infile.csv"
      STEP1_OUT_F = data_dir / "1_outfile.csv"
      STEP2_OUT_F = data_dir / "2_outfile.csv"
      
      # step 1
      step1_data = utils.load_data[STEP1_IN_F]
      step1_out = myapi_obj.process[step1_data]
      utils.save_data[step1_out, STEP1_OUT_F]
      
      # step 2
      step2_out = utils.process[step1_out]
      utils.save_data[step2_out, STEP2_OUT_F]
      
      3 bên trong tệp bước 1 và một lần nữa thay đổi nó trong tệp bước 2 vì nó được sử dụng làm đầu vào trong bước 2
    • Nếu bạn xác định các hằng số trong tệp chính và gửi chúng dưới dạng đối số hàm trong mỗi bước, thì bạn sẽ loại bỏ được sự dư thừa, nhưng khi làm như vậy, bạn đã làm cho mã trở nên khó đọc hơn nếu bạn có nhiều biến như vậy cần chuyển. Một cách để giải quyết vấn đề này là thêm tất cả các hằng số này vào bên trong một
      import myapi
      import utils
      
      from pathlib import Path
      
      API_SECRET_KEY = "SECRET_IS_THERE_IS_NO_SECRET"
      myapi_obj = myapi[API_SECRET_KEY]
      
      data_dir = Path["./data/"]
      STEP1_IN_F = data_dir / "1_infile.csv"
      STEP1_OUT_F = data_dir / "1_outfile.csv"
      STEP2_OUT_F = data_dir / "2_outfile.csv"
      
      # step 1
      step1_data = utils.load_data[STEP1_IN_F]
      step1_out = myapi_obj.process[step1_data]
      utils.save_data[step1_out, STEP1_OUT_F]
      
      # step 2
      step2_out = utils.process[step1_out]
      utils.save_data[step2_out, STEP2_OUT_F]
      
      4 và sau đó chuyển
      import myapi
      import utils
      
      from pathlib import Path
      
      API_SECRET_KEY = "SECRET_IS_THERE_IS_NO_SECRET"
      myapi_obj = myapi[API_SECRET_KEY]
      
      data_dir = Path["./data/"]
      STEP1_IN_F = data_dir / "1_infile.csv"
      STEP1_OUT_F = data_dir / "1_outfile.csv"
      STEP2_OUT_F = data_dir / "2_outfile.csv"
      
      # step 1
      step1_data = utils.load_data[STEP1_IN_F]
      step1_out = myapi_obj.process[step1_data]
      utils.save_data[step1_out, STEP1_OUT_F]
      
      # step 2
      step2_out = utils.process[step1_out]
      utils.save_data[step2_out, STEP2_OUT_F]
      
      4 đó xung quanh. Nhưng điều này vẫn yêu cầu chúng tôi xác định
      import myapi
      import utils
      
      from pathlib import Path
      
      API_SECRET_KEY = "SECRET_IS_THERE_IS_NO_SECRET"
      myapi_obj = myapi[API_SECRET_KEY]
      
      data_dir = Path["./data/"]
      STEP1_IN_F = data_dir / "1_infile.csv"
      STEP1_OUT_F = data_dir / "1_outfile.csv"
      STEP2_OUT_F = data_dir / "2_outfile.csv"
      
      # step 1
      step1_data = utils.load_data[STEP1_IN_F]
      step1_out = myapi_obj.process[step1_data]
      utils.save_data[step1_out, STEP1_OUT_F]
      
      # step 2
      step2_out = utils.process[step1_out]
      utils.save_data[step2_out, STEP2_OUT_F]
      
      4 bên trong tệp chính sẽ thêm mã soạn sẵn

Để giải quyết các vấn đề về mã hóa cứng, dự phòng và mã soạn sẵn, chúng ta có thể lưu tất cả các hằng số bên trong một tệp văn bản riêng biệt [e. g. ,

import myapi
import utils

from pathlib import Path

API_SECRET_KEY = "SECRET_IS_THERE_IS_NO_SECRET"
myapi_obj = myapi[API_SECRET_KEY]

data_dir = Path["./data/"]
STEP1_IN_F = data_dir / "1_infile.csv"
STEP1_OUT_F = data_dir / "1_outfile.csv"
STEP2_OUT_F = data_dir / "2_outfile.csv"

# step 1
step1_data = utils.load_data[STEP1_IN_F]
step1_out = myapi_obj.process[step1_data]
utils.save_data[step1_out, STEP1_OUT_F]

# step 2
step2_out = utils.process[step1_out]
utils.save_data[step2_out, STEP2_OUT_F]
7] và sau đó tải tệp này bên trong tệp chính và sau đó chỉ cần chuyển đối tượng đó xung quanh. Vấn đề với điều này sẽ là phân tích cú pháp tệp văn bản để nhận tất cả các giá trị và đúng kiểu dữ liệu. Và đây là nơi mô-đun python
import myapi
import utils

from pathlib import Path

API_SECRET_KEY = "SECRET_IS_THERE_IS_NO_SECRET"
myapi_obj = myapi[API_SECRET_KEY]

data_dir = Path["./data/"]
STEP1_IN_F = data_dir / "1_infile.csv"
STEP1_OUT_F = data_dir / "1_outfile.csv"
STEP2_OUT_F = data_dir / "2_outfile.csv"

# step 1
step1_data = utils.load_data[STEP1_IN_F]
step1_out = myapi_obj.process[step1_data]
utils.save_data[step1_out, STEP1_OUT_F]

# step 2
step2_out = utils.process[step1_out]
utils.save_data[step2_out, STEP2_OUT_F]
8 trợ giúp

Trình phân tích tệp cấu hình

Trang tài liệu Python có một tài liệu tham khảo khá toàn diện về cách sử dụng

import myapi
import utils

from pathlib import Path

API_SECRET_KEY = "SECRET_IS_THERE_IS_NO_SECRET"
myapi_obj = myapi[API_SECRET_KEY]

data_dir = Path["./data/"]
STEP1_IN_F = data_dir / "1_infile.csv"
STEP1_OUT_F = data_dir / "1_outfile.csv"
STEP2_OUT_F = data_dir / "2_outfile.csv"

# step 1
step1_data = utils.load_data[STEP1_IN_F]
step1_out = myapi_obj.process[step1_data]
utils.save_data[step1_out, STEP1_OUT_F]

# step 2
step2_out = utils.process[step1_out]
utils.save_data[step2_out, STEP2_OUT_F]
8. Tôi sẽ chỉ ra những thay đổi cần thực hiện trong ứng dụng đồ chơi của chúng ta

Đây là cấu hình mới của chúng tôi -

import myapi
import utils

from pathlib import Path

API_SECRET_KEY = "SECRET_IS_THERE_IS_NO_SECRET"
myapi_obj = myapi[API_SECRET_KEY]

data_dir = Path["./data/"]
STEP1_IN_F = data_dir / "1_infile.csv"
STEP1_OUT_F = data_dir / "1_outfile.csv"
STEP2_OUT_F = data_dir / "2_outfile.csv"

# step 1
step1_data = utils.load_data[STEP1_IN_F]
step1_out = myapi_obj.process[step1_data]
utils.save_data[step1_out, STEP1_OUT_F]

# step 2
step2_out = utils.process[step1_out]
utils.save_data[step2_out, STEP2_OUT_F]
7

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2____13

Và đây là mã đã thay đổi của chúng tôi trong

import myapi
import utils

from pathlib import Path

API_SECRET_KEY = "SECRET_IS_THERE_IS_NO_SECRET"
myapi_obj = myapi[API_SECRET_KEY]

data_dir = Path["./data/"]
STEP1_IN_F = data_dir / "1_infile.csv"
STEP1_OUT_F = data_dir / "1_outfile.csv"
STEP2_OUT_F = data_dir / "2_outfile.csv"

# step 1
step1_data = utils.load_data[STEP1_IN_F]
step1_out = myapi_obj.process[step1_data]
utils.save_data[step1_out, STEP1_OUT_F]

# step 2
step2_out = utils.process[step1_out]
utils.save_data[step2_out, STEP2_OUT_F]
1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
6

Với

import myapi
import utils

from pathlib import Path

API_SECRET_KEY = "SECRET_IS_THERE_IS_NO_SECRET"
myapi_obj = myapi[API_SECRET_KEY]

data_dir = Path["./data/"]
STEP1_IN_F = data_dir / "1_infile.csv"
STEP1_OUT_F = data_dir / "1_outfile.csv"
STEP2_OUT_F = data_dir / "2_outfile.csv"

# step 1
step1_data = utils.load_data[STEP1_IN_F]
step1_out = myapi_obj.process[step1_data]
utils.save_data[step1_out, STEP1_OUT_F]

# step 2
step2_out = utils.process[step1_out]
utils.save_data[step2_out, STEP2_OUT_F]
8 chúng tôi có những ưu điểm sau

  • Chúng tôi đã loại bỏ nhu cầu mã hóa cứng các hằng số bên trong mã chính -
    import myapi
    import utils
    
    from pathlib import Path
    
    API_SECRET_KEY = "SECRET_IS_THERE_IS_NO_SECRET"
    myapi_obj = myapi[API_SECRET_KEY]
    
    data_dir = Path["./data/"]
    STEP1_IN_F = data_dir / "1_infile.csv"
    STEP1_OUT_F = data_dir / "1_outfile.csv"
    STEP2_OUT_F = data_dir / "2_outfile.csv"
    
    # step 1
    step1_data = utils.load_data[STEP1_IN_F]
    step1_out = myapi_obj.process[step1_data]
    utils.save_data[step1_out, STEP1_OUT_F]
    
    # step 2
    step2_out = utils.process[step1_out]
    utils.save_data[step2_out, STEP2_OUT_F]
    
    1
  • Mọi thay đổi trong cấu hình [
    import myapi
    import utils
    
    from pathlib import Path
    
    API_SECRET_KEY = "SECRET_IS_THERE_IS_NO_SECRET"
    myapi_obj = myapi[API_SECRET_KEY]
    
    data_dir = Path["./data/"]
    STEP1_IN_F = data_dir / "1_infile.csv"
    STEP1_OUT_F = data_dir / "1_outfile.csv"
    STEP2_OUT_F = data_dir / "2_outfile.csv"
    
    # step 1
    step1_data = utils.load_data[STEP1_IN_F]
    step1_out = myapi_obj.process[step1_data]
    utils.save_data[step1_out, STEP1_OUT_F]
    
    # step 2
    step2_out = utils.process[step1_out]
    utils.save_data[step2_out, STEP2_OUT_F]
    
    7] sẽ không ảnh hưởng đến mã
    import myapi
    import utils
    
    from pathlib import Path
    
    API_SECRET_KEY = "SECRET_IS_THERE_IS_NO_SECRET"
    myapi_obj = myapi[API_SECRET_KEY]
    
    data_dir = Path["./data/"]
    STEP1_IN_F = data_dir / "1_infile.csv"
    STEP1_OUT_F = data_dir / "1_outfile.csv"
    STEP2_OUT_F = data_dir / "2_outfile.csv"
    
    # step 1
    step1_data = utils.load_data[STEP1_IN_F]
    step1_out = myapi_obj.process[step1_data]
    utils.save_data[step1_out, STEP1_OUT_F]
    
    # step 2
    step2_out = utils.process[step1_out]
    utils.save_data[step2_out, STEP2_OUT_F]
    
    1
  • Bạn có thể quản lý cấu hình của mình một cách hợp lý bên trong
    import myapi
    import utils
    
    from pathlib import Path
    
    API_SECRET_KEY = "SECRET_IS_THERE_IS_NO_SECRET"
    myapi_obj = myapi[API_SECRET_KEY]
    
    data_dir = Path["./data/"]
    STEP1_IN_F = data_dir / "1_infile.csv"
    STEP1_OUT_F = data_dir / "1_outfile.csv"
    STEP2_OUT_F = data_dir / "2_outfile.csv"
    
    # step 1
    step1_data = utils.load_data[STEP1_IN_F]
    step1_out = myapi_obj.process[step1_data]
    utils.save_data[step1_out, STEP1_OUT_F]
    
    # step 2
    step2_out = utils.process[step1_out]
    utils.save_data[step2_out, STEP2_OUT_F]
    
    7 dưới các tiêu đề khác nhau. cho e. g. , phần
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    27 có thể được chia thành tiêu đề
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    28 và
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    29

Một số điều mà tôi cảm thấy khó khăn hoặc rườm rà khi sử dụng

import myapi
import utils

from pathlib import Path

API_SECRET_KEY = "SECRET_IS_THERE_IS_NO_SECRET"
myapi_obj = myapi[API_SECRET_KEY]

data_dir = Path["./data/"]
STEP1_IN_F = data_dir / "1_infile.csv"
STEP1_OUT_F = data_dir / "1_outfile.csv"
STEP2_OUT_F = data_dir / "2_outfile.csv"

# step 1
step1_data = utils.load_data[STEP1_IN_F]
step1_out = myapi_obj.process[step1_data]
utils.save_data[step1_out, STEP1_OUT_F]

# step 2
step2_out = utils.process[step1_out]
utils.save_data[step2_out, STEP2_OUT_F]
8

  • Thiếu suy luận kiểu dữ liệu tự động. Bạn phải sử dụng các hàm getter cụ thể [
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    31,
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    32,
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    33] hoặc tạo hàm của riêng bạn. Ví dụ: tôi không muốn chuyển đổi các đường dẫn chuỗi của mình [
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    34,
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    35,
    import myapi
    import utils
    
    from pathlib import Path
    
    API_SECRET_KEY = "SECRET_IS_THERE_IS_NO_SECRET"
    myapi_obj = myapi[API_SECRET_KEY]
    
    data_dir = Path["./data/"]
    STEP1_IN_F = data_dir / "1_infile.csv"
    STEP1_OUT_F = data_dir / "1_outfile.csv"
    STEP2_OUT_F = data_dir / "2_outfile.csv"
    
    # step 1
    step1_data = utils.load_data[STEP1_IN_F]
    step1_out = myapi_obj.process[step1_data]
    utils.save_data[step1_out, STEP1_OUT_F]
    
    # step 2
    step2_out = utils.process[step1_out]
    utils.save_data[step2_out, STEP2_OUT_F]
    
    3 và
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    37] thành các đối tượng
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    38 bên trong
    import myapi
    import utils
    
    from pathlib import Path
    
    API_SECRET_KEY = "SECRET_IS_THERE_IS_NO_SECRET"
    myapi_obj = myapi[API_SECRET_KEY]
    
    data_dir = Path["./data/"]
    STEP1_IN_F = data_dir / "1_infile.csv"
    STEP1_OUT_F = data_dir / "1_outfile.csv"
    STEP2_OUT_F = data_dir / "2_outfile.csv"
    
    # step 1
    step1_data = utils.load_data[STEP1_IN_F]
    step1_out = myapi_obj.process[step1_data]
    utils.save_data[step1_out, STEP1_OUT_F]
    
    # step 2
    step2_out = utils.process[step1_out]
    utils.save_data[step2_out, STEP2_OUT_F]
    
    1. Tôi muốn trình tải cấu hình của mình xử lý việc đó
  • Cấu hình trở nên khó quản lý nếu cấu hình quá lớn và liên quan đến nhiều hằng số hoặc bước. Bạn sẽ phải chia nó thành nhiều tệp và tải chúng riêng lẻ và thực hiện tất cả các công cụ phân tích cú pháp

Chúng ta có thể làm tốt hơn. Chúng ta sẽ có thể xử lý những vấn đề này một cách tao nhã. Và chúng tôi làm điều đó bằng cách tạo một mô-đun cho chính cấu hình

mô-đun cấu hình

Đối với mỗi tiêu đề từ

import myapi
import utils

from pathlib import Path

API_SECRET_KEY = "SECRET_IS_THERE_IS_NO_SECRET"
myapi_obj = myapi[API_SECRET_KEY]

data_dir = Path["./data/"]
STEP1_IN_F = data_dir / "1_infile.csv"
STEP1_OUT_F = data_dir / "1_outfile.csv"
STEP2_OUT_F = data_dir / "2_outfile.csv"

# step 1
step1_data = utils.load_data[STEP1_IN_F]
step1_out = myapi_obj.process[step1_data]
utils.save_data[step1_out, STEP1_OUT_F]

# step 2
step2_out = utils.process[step1_out]
utils.save_data[step2_out, STEP2_OUT_F]
7, tôi sẽ tạo một lớp mới và nhập chúng vào bên trong
import myapi
import utils

from pathlib import Path

API_SECRET_KEY = "SECRET_IS_THERE_IS_NO_SECRET"
myapi_obj = myapi[API_SECRET_KEY]

data_dir = Path["./data/"]
STEP1_IN_F = data_dir / "1_infile.csv"
STEP1_OUT_F = data_dir / "1_outfile.csv"
STEP2_OUT_F = data_dir / "2_outfile.csv"

# step 1
step1_data = utils.load_data[STEP1_IN_F]
step1_out = myapi_obj.process[step1_data]
utils.save_data[step1_out, STEP1_OUT_F]

# step 2
step2_out = utils.process[step1_out]
utils.save_data[step2_out, STEP2_OUT_F]
1. Đây là giao diện của
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
52 mới

import myapi
import utils

from pathlib import Path

API_SECRET_KEY = "SECRET_IS_THERE_IS_NO_SECRET"
myapi_obj = myapi[API_SECRET_KEY]

data_dir = Path["./data/"]
STEP1_IN_F = data_dir / "1_infile.csv"
STEP1_OUT_F = data_dir / "1_outfile.csv"
STEP2_OUT_F = data_dir / "2_outfile.csv"

# step 1
step1_data = utils.load_data[STEP1_IN_F]
step1_out = myapi_obj.process[step1_data]
utils.save_data[step1_out, STEP1_OUT_F]

# step 2
step2_out = utils.process[step1_out]
utils.save_data[step2_out, STEP2_OUT_F]
8
import myapi
import utils

from pathlib import Path

API_SECRET_KEY = "SECRET_IS_THERE_IS_NO_SECRET"
myapi_obj = myapi[API_SECRET_KEY]

data_dir = Path["./data/"]
STEP1_IN_F = data_dir / "1_infile.csv"
STEP1_OUT_F = data_dir / "1_outfile.csv"
STEP2_OUT_F = data_dir / "2_outfile.csv"

# step 1
step1_data = utils.load_data[STEP1_IN_F]
step1_out = myapi_obj.process[step1_data]
utils.save_data[step1_out, STEP1_OUT_F]

# step 2
step2_out = utils.process[step1_out]
utils.save_data[step2_out, STEP2_OUT_F]
9

Đây là cách chúng tôi sử dụng cấu hình trên bên trong

import myapi
import utils

from pathlib import Path

API_SECRET_KEY = "SECRET_IS_THERE_IS_NO_SECRET"
myapi_obj = myapi[API_SECRET_KEY]

data_dir = Path["./data/"]
STEP1_IN_F = data_dir / "1_infile.csv"
STEP1_OUT_F = data_dir / "1_outfile.csv"
STEP2_OUT_F = data_dir / "2_outfile.csv"

# step 1
step1_data = utils.load_data[STEP1_IN_F]
step1_out = myapi_obj.process[step1_data]
utils.save_data[step1_out, STEP1_OUT_F]

# step 2
step2_out = utils.process[step1_out]
utils.save_data[step2_out, STEP2_OUT_F]
1

import myapi
import utils

from pathlib import Path

API_SECRET_KEY = "SECRET_IS_THERE_IS_NO_SECRET"
myapi_obj = myapi[API_SECRET_KEY]

data_dir = Path["./data/"]
STEP1_IN_F = data_dir / "1_infile.csv"
STEP1_OUT_F = data_dir / "1_outfile.csv"
STEP2_OUT_F = data_dir / "2_outfile.csv"

# step 1
step1_data = utils.load_data[STEP1_IN_F]
step1_out = myapi_obj.process[step1_data]
utils.save_data[step1_out, STEP1_OUT_F]

# step 2
step2_out = utils.process[step1_out]
utils.save_data[step2_out, STEP2_OUT_F]
1
import myapi
import utils

from pathlib import Path

API_SECRET_KEY = "SECRET_IS_THERE_IS_NO_SECRET"
myapi_obj = myapi[API_SECRET_KEY]

data_dir = Path["./data/"]
STEP1_IN_F = data_dir / "1_infile.csv"
STEP1_OUT_F = data_dir / "1_outfile.csv"
STEP2_OUT_F = data_dir / "2_outfile.csv"

# step 1
step1_data = utils.load_data[STEP1_IN_F]
step1_out = myapi_obj.process[step1_data]
utils.save_data[step1_out, STEP1_OUT_F]

# step 2
step2_out = utils.process[step1_out]
utils.save_data[step2_out, STEP2_OUT_F]
2

Hãy nhìn xem

import myapi
import utils

from pathlib import Path

API_SECRET_KEY = "SECRET_IS_THERE_IS_NO_SECRET"
myapi_obj = myapi[API_SECRET_KEY]

data_dir = Path["./data/"]
STEP1_IN_F = data_dir / "1_infile.csv"
STEP1_OUT_F = data_dir / "1_outfile.csv"
STEP2_OUT_F = data_dir / "2_outfile.csv"

# step 1
step1_data = utils.load_data[STEP1_IN_F]
step1_out = myapi_obj.process[step1_data]
utils.save_data[step1_out, STEP1_OUT_F]

# step 2
step2_out = utils.process[step1_out]
utils.save_data[step2_out, STEP2_OUT_F]
1 của chúng ta bây giờ sạch sẽ như thế nào. Đây là lý do tại sao tôi nghĩ phương pháp này tốt hơn hai phương pháp trên-

  • Không có mã không cần thiết để xác định, tải và phân tích cú pháp cấu hình bên trong tệp chính. Nếu bạn để ý, hiện tại tôi không sử dụng mô-đun
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    55 bên trong
    import myapi
    import utils
    
    from pathlib import Path
    
    API_SECRET_KEY = "SECRET_IS_THERE_IS_NO_SECRET"
    myapi_obj = myapi[API_SECRET_KEY]
    
    data_dir = Path["./data/"]
    STEP1_IN_F = data_dir / "1_infile.csv"
    STEP1_OUT_F = data_dir / "1_outfile.csv"
    STEP2_OUT_F = data_dir / "2_outfile.csv"
    
    # step 1
    step1_data = utils.load_data[STEP1_IN_F]
    step1_out = myapi_obj.process[step1_data]
    utils.save_data[step1_out, STEP1_OUT_F]
    
    # step 2
    step2_out = utils.process[step1_out]
    utils.save_data[step2_out, STEP2_OUT_F]
    
    1, do đó, điều này đã làm cho tệp py sạch hơn nhiều
  • Bây giờ chúng tôi đang xác định kiểu dữ liệu của các biến bên trong cấu hình. Nếu bạn nhìn vào các định nghĩa lớp cấu hình [
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    57 và
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    58], tất cả các đường dẫn của tôi bây giờ là các đối tượng
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    38
  • Nếu cần, bạn thậm chí có thể xác thực cấu hình của mình bên trong
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    52. Bạn có thể kiểm tra xem một thư mục/tệp có tồn tại hay không
  • Cấu hình có thể được quản lý và tổ chức theo cách tốt hơn mà không cần bất kỳ mã dự phòng nào. Do tính kế thừa của lớp,
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    34 có sẵn bên trong mỗi lớp bước riêng lẻ. Và, vì đầu ra của bước 1 là đầu vào của bước 2, nên tôi chỉ xác định đường dẫn tệp ra bên trong lớp bước 1 và sử dụng biến đó bên trong lớp bước 2. Bằng cách này, sự dư thừa không còn nữa và không có khả năng bỏ sót lần thay đổi thứ hai sau khi thay đổi lần đầu tiên
  • Có một lợi thế khác mà bạn sẽ đánh giá cao khi mã của bạn được cho là chạy trong các môi trường khác nhau [e. g. , SIT, Tiền sản xuất hoặc Sản xuất]. Bạn sẽ làm cho mọi thứ chạy trên máy cục bộ của mình, nhưng nhiều hằng số sẽ thay đổi trong các môi trường thử nghiệm khác như url cơ sở dữ liệu, đường dẫn HDFS, v.v. Để xử lý việc đó, chúng ta có thể tải các biến shell env thay vì thay đổi giá trị mặc định trong

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    52. Thêm đoạn mã sau vào bên trong
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    63 sẽ đạt được điều đó

    import myapi
    import utils
    
    from pathlib import Path
    
    API_SECRET_KEY = "SECRET_IS_THERE_IS_NO_SECRET"
    myapi_obj = myapi[API_SECRET_KEY]
    
    data_dir = Path["./data/"]
    STEP1_IN_F = data_dir / "1_infile.csv"
    STEP1_OUT_F = data_dir / "1_outfile.csv"
    STEP2_OUT_F = data_dir / "2_outfile.csv"
    
    # step 1
    step1_data = utils.load_data[STEP1_IN_F]
    step1_out = myapi_obj.process[step1_data]
    utils.save_data[step1_out, STEP1_OUT_F]
    
    # step 2
    step2_out = utils.process[step1_out]
    utils.save_data[step2_out, STEP2_OUT_F]
    
    0

  • Bạn cũng có thể triển khai phương thức
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    64 trong mỗi lớp để in toàn bộ cấu hình theo bất kỳ định dạng nào bạn muốn

Nhược điểm duy nhất của phương pháp này là đôi khi nó giống như kỹ thuật quá mức đối với nhiều trường hợp sử dụng nhỏ. Mặc dù sử dụng phương pháp này trong tất cả dự án mới của tôi đã mang lại cho tôi nhiều kiểu sử dụng

Công cụ quản lý cấu hình nào sử dụng Python?

Python - quản lý cấu hình .
gói hydra-core
gói tách rời
omegaconf

Ví dụ về phần mềm quản lý cấu hình Python là gì?

Ansible là công cụ triển khai ứng dụng và quản lý cấu hình mã nguồn mở được tích hợp trong Python.

Cấu hình Python là gì?

Cấu hình Python có thể được sử dụng để xây dựng Python tùy chỉnh hoạt động như Python thông thường . Ví dụ: các biến môi trường và đối số dòng lệnh được sử dụng để định cấu hình Python. Cấu hình biệt lập có thể được sử dụng để nhúng Python vào một ứng dụng. Nó cô lập Python khỏi hệ thống.

Dynaconf Python là gì?

Dynaconf là cấu hình động cho các ứng dụng Python . Với nó, bạn có thể đặt một mô-đun cài đặt chuẩn để sử dụng cho tất cả các phiên bản.

Chủ Đề