Python Fire ยัติภังค์เทียบกับขีดล่าง

Oct 16 2020

แพคเกจ 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 ไม่สามารถมียัติภังค์ในชื่อตัวแปรได้

คำตอบ

2 JonathanDayton Oct 24 2020 at 04:07

ดูเหมือนว่าจะใช้ได้กับขีดกลางหรือขีดล่างอาจเป็นเพราะโค้ดบรรทัดนี้ การใช้สคริปต์ของคุณ:

> 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 หากกรณีการใช้งานของคุณซับซ้อนกว่านี้ไลบรารีอื่นอาจดีกว่า

Simplecode Oct 19 2020 at 20:25

ไม่แน่ใจเกี่ยวกับFireโมดูล แต่ฉันมีแอปพลิเคชันบรรทัดคำสั่ง python ที่เราใช้nameofcatไวยากรณ์ประเภท ฉันส่งคำที่มี aplhabets มากถึง 17 คำในนั้นเป็นอาร์กิวเมนต์ของสคริปต์และฉันไม่ได้ใช้ขีดกลางหรือขีดล่างใด ๆ