Saya menggunakan argparse
Python 2.7 untuk parsing opsi input. Salah satu opsi saya adalah pilihan ganda. Saya ingin membuat daftar dalam teks bantuannya, mis
from argparse import ArgumentParser
parser = ArgumentParser(description='test')
parser.add_argument('-g', choices=['a', 'b', 'g', 'd', 'e'], default='a',
help="Some option, where\n"
" a = alpha\n"
" b = beta\n"
" g = gamma\n"
" d = delta\n"
" e = epsilon")
parser.parse_args()
Namun, argparse
lepaskan semua baris baru dan spasi berurutan. Hasilnya terlihat seperti
~ / Unduhan: 52 $ python2.7 x.py -h penggunaan: x.py [-h] [-g {a, b, g, d, e}] uji argumen opsional: -h, --help tampilkan pesan bantuan ini dan keluar -g {a, b, g, d, e} Beberapa opsi, di mana a = alpha b = beta g = gamma d = delta e = epsilon
Bagaimana cara memasukkan baris baru dalam teks bantuan?
argparse
, bukan interpreter, jadi beralih ke"""..."""
tidak akan membantu.Jawaban:
Coba gunakan
RawTextHelpFormatter
:sumber
Only the name of this class is considered a public API. All the methods provided by the class are considered an implementation detail.
Jadi mungkin bukan ide yang bagus, meskipun mungkin tidak masalah, karena 2,7 dimaksudkan untuk menjadi 2.x python terakhir dan Anda akan diharapkan untuk memperbaiki banyak hal untuk 3.x pula. Saya sebenarnya menjalankan 2.6 denganargparse
diinstal melaluieasy_install
sehingga dokumentasi itu sendiri mungkin sudah ketinggalan zaman.RawDescriptionHelpFormatter
yang hanya berfungsi pada deskripsi dan epilog daripada teks bantuan.RawTextHelpFormatter
, memimpin dan mengikuti baris baru dihapus. Untuk mengatasinya, Anda cukup menambahkan dua atau lebih baris baru berturut-turut; semua kecuali satu baris baru akan bertahan.class Formatter( argparse.ArgumentDefaultsHelpFormatter, argparse.RawDescriptionHelpFormatter): pass
laluformatter_class=Formatter
.Jika Anda hanya ingin mengganti satu opsi, Anda tidak boleh menggunakan
RawTextHelpFormatter
. Alih-alih subklasHelpFormatter
dan menyediakan intro khusus untuk opsi yang harus ditangani "mentah" (Saya menggunakan"R|rest of help"
):Dan gunakan itu:
Panggilan lain ke
.add_argument()
tempat bantuan tidak dimulaiR|
akan dibungkus seperti biasa.Ini adalah bagian dari perbaikan saya pada argparse . SmartFormatter lengkap juga mendukung penambahan default ke semua opsi, dan input mentah dari deskripsi utilitas. Versi lengkap memiliki
_split_lines
metode sendiri , sehingga pemformatan apapun yang dilakukan misalnya string versi dipertahankan:sumber
parser.add_argument('-v', '--version', action='version',version=get_version_str())
Apakah mungkin memperluasnya ke kasus itu?_split_lines
dan mempertahankan jeda baris (tidak perlu menentukan "R |" di awal, jika Anda ingin opsi itu, tambal_VersionAction.__call__
metode_VersionAction.__call__
bahwa saya mungkin ingin hanyaparser.exit(message=version)
menggunakan versi yang diformat. Apakah ada cara untuk melakukan itu tanpa merilis salinan argparse yang ditambal?__call__
di_VersionAction
dengan melakukanargparse._VersionAction.__call__ = smart_version
setelah mendefinisikandef smart_version(self, parser, namespace, values, option_string=None): ...
Cara mudah lain untuk melakukannya adalah dengan menyertakan textwrap .
Sebagai contoh,
Dengan cara ini, kita dapat menghindari ruang kosong yang panjang di depan setiap jalur output.
sumber
Saya telah menghadapi masalah serupa (Python 2.7.6). Saya telah mencoba memecah bagian deskripsi menjadi beberapa baris menggunakan
RawTextHelpFormatter
:Dan mendapatkan:
Jadi
RawTextHelpFormatter
bukan solusi. Karena ia mencetak deskripsi seperti yang muncul dalam kode sumber, menjaga semua karakter spasi putih (saya ingin menyimpan tab tambahan dalam kode sumber saya untuk keterbacaan tetapi saya tidak ingin mencetak semuanya. Juga formatter mentah tidak membungkus baris ketika itu terlalu panjang, lebih dari 80 karakter misalnya).Terima kasih kepada @Anton yang menginspirasi arah yang benar di atas . Tetapi solusi itu perlu sedikit modifikasi untuk memformat bagian deskripsi .
Bagaimanapun, formatter khusus diperlukan. Saya memperpanjang metode
HelpFormatter
kelas dan overrode yang sudah ada_fill_text
seperti ini:Bandingkan dengan kode sumber asli yang berasal dari modul argparse :
Dalam kode asli seluruh deskripsi sedang dibungkus. Dalam formatter khusus di atas, seluruh teks dibagi menjadi beberapa bagian, dan masing-masing diformat secara independen.
Jadi dengan bantuan formatter khusus:
outputnya adalah:
sumber
HelpFormatter
bermasalah karena pengembang argparse hanya menjamin bahwa nama kelas akan bertahan di versi argparse yang akan datang. Mereka pada dasarnya menulis cek kosong sendiri sehingga mereka dapat mengubah nama metode jika akan lebih mudah bagi mereka untuk melakukannya. Saya menemukan ini frustasi; paling tidak yang bisa mereka lakukan adalah mengekspos beberapa metode dalam API.Saya ingin memiliki kedua jeda baris manual dalam teks deskripsi, dan membungkusnya secara otomatis; tetapi tidak ada saran di sini yang bekerja untuk saya - jadi saya akhirnya memodifikasi kelas SmartFormatter yang diberikan dalam jawaban di sini; masalah dengan nama metode argparse tidak menjadi API publik meskipun, di sini adalah apa yang saya miliki (sebagai file bernama
test.py
):Ini adalah cara kerjanya di 2.7 dan 3.4:
sumber
Mulai dari SmartFomatter yang dijelaskan di atas, saya mengakhiri solusi itu:
Perhatikan bahwa anehnya argumen formatter_class yang diteruskan ke parser tingkat atas tidak diwariskan oleh sub_parser, seseorang harus meneruskannya lagi untuk setiap sub_parser yang dibuat.
sumber
Kata pengantar
Untuk pertanyaan ini,
argparse.RawTextHelpFormatter
sangat membantu saya.Sekarang, saya ingin berbagi bagaimana cara menggunakan
argparse
.Saya tahu itu mungkin tidak terkait dengan pertanyaan,
tetapi pertanyaan-pertanyaan ini telah mengganggu saya untuk sementara waktu.
Jadi saya ingin membagikan pengalaman saya, semoga bermanfaat bagi seseorang.
Kita mulai.
Modul Pihak ke-3
colorama : untuk mengubah warna teks:
pip install colorama
Contoh
Dimana kelasnya
FormatText
adalah sebagai berikutsumber