Saya menggunakan kode sederhana berikut untuk mem-parsing beberapa argumen; perhatikan bahwa salah satunya diperlukan. Sayangnya, ketika pengguna menjalankan skrip tanpa memberikan argumen, teks penggunaan / bantuan yang ditampilkan tidak menunjukkan bahwa ada argumen non-opsional, yang menurut saya sangat membingungkan. Bagaimana saya bisa mendapatkan python untuk menunjukkan bahwa argumen tidak opsional?
Ini kodenya:
import argparse
if __name__ == '__main__':
parser = argparse.ArgumentParser(
description='Foo')
parser.add_argument('-i','--input', help='Input file name', required=True)
parser.add_argument('-o','--output', help='Output file name', default="stdout")
args = parser.parse_args()
print ("Input file: %s" % args.input )
print ("Output file: %s" % args.output )
Saat menjalankan kode di atas tanpa memberikan argumen yang diperlukan, saya mendapatkan output berikut:
usage: foo.py [-h] -i INPUT [-o OUTPUT]
Foo
optional arguments:
-h, --help show this help message and exit
-i INPUT, --input INPUT
Input file name
-o OUTPUT, --output OUTPUT
Output file name
-i INPUT
bagian tersebut tidak dikelilingi oleh tanda kurung siku, yang menunjukkan kehalusan yang memang diperlukan. Anda juga dapat menjelaskannya secara manual melaluihelp
paramoptional arguments
untuk argumen yang diperlukan masih menyesatkan.Jawaban:
Parameter yang dimulai dengan
-
atau--
biasanya dianggap opsional. Semua parameter lain adalah parameter posisi dan karena itu diperlukan oleh desain (seperti argumen fungsi posisi). Dimungkinkan untuk memerlukan argumen opsional, tetapi ini sedikit bertentangan dengan desain mereka. Karena mereka masih merupakan bagian dari argumen non-posisional, mereka masih akan terdaftar di bawah header “argumen opsional” yang membingungkan walaupun mereka diharuskan. Namun tanda kurung kotak yang hilang pada bagian penggunaan menunjukkan bahwa mereka memang diperlukan.Lihat juga dokumentasinya :
Karena itu, tajuk “argumen posisional” dan “argumen opsional” dalam bantuan dihasilkan oleh dua kelompok argumen di mana argumen dipisahkan secara otomatis. Sekarang, Anda bisa "meretasnya" dan mengubah nama yang opsional, tetapi solusi yang jauh lebih elegan adalah membuat grup lain untuk "argumen bernama wajib" (atau apa pun yang Anda ingin menyebutnya):
sumber
parser.parse_args([])
Sebaliknya, gunakanparser.parse_args()
tanpa argumen untuk menangkap konten sys.argv. Per argparseKarena saya lebih suka mendaftar argumen yang diperlukan sebelum opsional, saya meretasnya melalui:
dan ini menghasilkan:
Saya bisa hidup tanpa 'bantuan' muncul di grup argumen opsional.
sumber
Membangun dari @Karl Rosaen
dan ini menghasilkan:
sumber
_action_group
tanpa mengakses anggota yang dilindungi? Dalam kasus saya, saya perlu menambahkan beberapa argumen ke grup (kustom) yang sudah ada.Sekali lagi, membangun dari @RalphyZ
Yang ini tidak merusak API yang terbuka.
Yang akan menunjukkan hal yang sama seperti di atas dan akan bertahan versi masa depan:
sumber
_action_groups
dimaksudkan hanya untuk penggunaan internal. Oleh karena itu, tidak ada jaminan kompatibilitas lintas versi.