Python Fire ยัติภังค์เทียบกับขีดล่าง
แพคเกจ python Fireมีประโยชน์มากสำหรับการเรียกใช้สคริปต์ python จากบรรทัดคำสั่ง สิ่งหนึ่งที่พบบ่อยคือการมีอาร์กิวเมนต์ที่ประกอบด้วยคำหลายคำเช่นชื่อแมวที่สามารถเขียนได้ 3 แบบ:
- nameofcat
- name_of_cat
- ชื่อแมว
ในขณะที่อันแรกเข้ากันได้กับทุกอย่าง แต่อันที่สองควรหลีกเลี่ยงใน bash ( ตัวเลือกบรรทัดคำสั่งในระบบปฏิบัติการสไตล์ POSIX ควรเป็นแบบขีดล่างหรือไม่ ) และอันที่สามใน python ( เหตุใด python จึงไม่อนุญาตให้ใช้ยัติภังค์ภายใน ฟังก์ชันและชื่อตัวแปร? )
ปัญหาที่นี่คือโดยค่าเริ่มต้นไฟจะใช้ชื่ออาร์กิวเมนต์จากรหัส python ซึ่งหมายความว่าหากรหัส python ของฉันมีลักษณะดังนี้:
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)
จากนั้นหากต้องการเรียกใช้จากบรรทัดคำสั่ง (หรือจากสคริปต์ทุบตี) ก็จะทำ
python script.py --name_of_cat Bob
นี่เป็นวิธีที่ฉันใช้อยู่ในขณะนี้ แต่รู้สึกว่าไม่เหมาะสม มีความคิดอย่างไรกับแนวทางปฏิบัติที่ดีที่สุดที่นี่
PS: python script.py --name-of-cat Bobเป็นไปไม่ได้เนื่องจาก python ไม่สามารถมียัติภังค์ในชื่อตัวแปรได้
คำตอบ
ดูเหมือนว่าจะใช้ได้กับขีดกลางหรือขีดล่างอาจเป็นเพราะโค้ดบรรทัดนี้ การใช้สคริปต์ของคุณ:
> 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
สิ่งนี้ยังระบุไว้ที่นี่ในเอกสาร Fire:
ในการสร้างอินสแตนซ์ a
Buildingแล้วเรียกใช้climb_stairsฟังก์ชันคำสั่งต่อไปนี้ใช้ได้ทั้งหมด:$ 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"คุณจะสังเกตเห็นว่ายัติภังค์และขีดล่าง (
-และ_) ใช้แทนกันได้ในชื่อสมาชิกและชื่อแฟล็ก
อย่างไรก็ตามข้อความช่วยเหลือที่สร้างขึ้นดูเหมือนจะขอตั้งค่าสถานะพร้อมขีดล่าง:
> 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
คำแนะนำของฉันคือถ้าคุณกำลังสร้างสคริปต์ด่วนสำหรับตัวคุณเอง Fire นั้นยอดเยี่ยม แต่ถ้าคุณกำลังทำบางสิ่งเพื่อกระจายหรือซับซ้อนมากขึ้นควรใช้กรอบที่กำหนดค่าได้มากกว่าเช่นargparse (รวมอยู่ใน stdlib) หรือคลิก (รายการโปรดส่วนตัวของฉัน) นี่คือรายการผลประโยชน์ที่ระบุด้วยตนเองของ Fire หากกรณีการใช้งานของคุณซับซ้อนกว่านี้ไลบรารีอื่นอาจดีกว่า
ไม่แน่ใจเกี่ยวกับFireโมดูล แต่ฉันมีแอปพลิเคชันบรรทัดคำสั่ง python ที่เราใช้nameofcatไวยากรณ์ประเภท ฉันส่งคำที่มี aplhabets มากถึง 17 คำในนั้นเป็นอาร์กิวเมนต์ของสคริปต์และฉันไม่ได้ใช้ขีดกลางหรือขีดล่างใด ๆ