Python Fire gạch nối và gạch dưới
Gói python Firerất hữu ích để khởi chạy các tập lệnh python từ dòng lệnh. Một điều phổ biến là có các đối số được tạo thành từ nhiều từ, chẳng hạn như tên của con mèo có thể được viết bằng 3 dấu phẩy:
- nameofcat
- name_of_cat
- tên của mèo
Mặc dù cái đầu tiên tương thích với khá nhiều thứ, cái thứ hai nên tránh trong bash ( Tùy chọn dòng lệnh trong hệ điều hành kiểu POSIX có nên là kiểu gạch dưới không? ) Và cái thứ ba trong python ( Tại sao python không cho phép sử dụng dấu gạch ngang trong tên hàm và biến? ).
Vấn đề ở đây là theo mặc định fire sẽ lấy tên đối số từ mã python, có nghĩa là nếu mã python của tôi trông như thế này:
script.py:
import fire
def main(name_of_cat='Steve'):
print(f'The name of the cast is {name_of_cat}')
if __name__ == '__main__':
fire.Fire(main)
sau đó để gọi nó từ dòng lệnh (hoặc từ một tập lệnh bash), người ta sẽ làm
python script.py --name_of_cat Bob
Đây là cách tôi đang sử dụng vào lúc này, nhưng điều này cảm thấy không tối ưu. Bất kỳ ý tưởng về thực hành tốt nhất là gì ở đây?
Tái bút: python script.py --name-of-cat Bobsẽ là không thể vì python không thể có gạch nối trong tên biến.
Trả lời
Có vẻ như nó hoạt động với cả dấu gạch ngang hoặc dấu gạch dưới, có thể là do dòng mã này . Sử dụng tập lệnh của bạn:
> python .\script.py --name_of_cat Bob
The name of the cast is Bob
> python .\script.py --name-of-cat Bob
The name of the cast is Bob
Điều này cũng được ghi nhận ở đây trong tài liệu về Lửa:
Để khởi tạo a
Buildingvà sau đó chạyclimb_stairshàm, các lệnh sau đều hợp lệ:$ python example.py --name="Sherrerd Hall" --stories=3 climb_stairs 10 $ python example.py --name="Sherrerd Hall" climb_stairs --stairs_per_story=10 $ python example.py --name="Sherrerd Hall" climb_stairs --stairs-per-story 10 $ python example.py climb-stairs --stairs-per-story 10 --name="Sherrerd Hall"Bạn sẽ nhận thấy rằng dấu gạch ngang và dấu gạch dưới (
-và_) có thể hoán đổi cho nhau trong tên thành viên và tên cờ.
Tuy nhiên, văn bản trợ giúp được tạo dường như yêu cầu một cờ có dấu gạch dưới:
> python .\script.py -h
INFO: Showing help with the command 'script.py -- --help'.
NAME
script.py
SYNOPSIS
script.py <flags>
FLAGS
--name_of_cat=NAME_OF_CAT
Khuyến nghị của tôi là nếu bạn đang tạo một kịch bản nhanh cho chính mình, thì Fire thật tuyệt vời, nhưng nếu bạn đang tạo ra một thứ gì đó để phân phối hoặc phức tạp hơn, thì tốt hơn nên sử dụng một khung có thể cấu hình cao hơn, như argparse (có trong stdlib) hoặc nhấp chuột (yêu thích cá nhân của tôi). Đây là danh sách các lợi ích tự công bố của Fire; nếu trường hợp sử dụng của bạn phức tạp hơn, một thư viện khác có thể tốt hơn.
Không chắc chắn về Firemô-đun nhưng tôi có một ứng dụng dòng lệnh python mà chúng tôi đang sử dụng nameofcatcú pháp loại. Tôi chuyển một từ với tổng số lên đến 17 aplhabet trong đó làm đối số cho tập lệnh và tôi không sử dụng bất kỳ dấu gạch ngang hay gạch dưới nào.