Για να χειριστείτε τα ορίσματα της γραμμής εντολών στην Python, χρησιμοποιήστε τις ενότητες argv ή argparse της ενότητας sys.
Η ενότητα argparse επιτρέπει τον ευέλικτο χειρισμό των επιχειρημάτων της γραμμής εντολών, αλλά πρέπει να δοθεί προσοχή όταν πρόκειται για τιμές Boolean (true, false).
Οι ακόλουθες πληροφορίες παρέχονται εδώ.
- argparse για εύκολο ορισμό των επιχειρημάτων
- Καθορίστε τον τύπο του ορίσματος (type) με argparse
- Μην καθορίζετε «bool» ως τύπο ορίσματος της add_argument()
- Κρίση από bool()
- Χρησιμοποιήστε την ενέργεια του επιχειρήματος αντί για τον τύπο του επιχειρήματος.
- Χρήση της συνάρτησης strtobool()
argparse για εύκολο ορισμό των επιχειρημάτων
Η ενότητα argparse διευκολύνει τον ορισμό των ορίων της γραμμής εντολών.
Η ενότητα argparse διευκολύνει τη δημιουργία φιλικών προς το χρήστη διεπαφών γραμμής εντολών. Εσείς ορίζετε ποια ορίσματα χρειάζεται το πρόγραμμά σας, και το argparse θα βρει τον τρόπο να αναλύσει αυτές τις επιλογές από το sys.argv. Η μονάδα argparse παράγει αυτόματα μηνύματα βοήθειας και χρήσης, και δημιουργεί ένα σφάλμα αν ο χρήστης ορίσει άκυρα ορίσματα στο πρόγραμμα. σφάλμα όταν ο χρήστης ορίσει άκυρα ορίσματα στο πρόγραμμα.
argparse — Parser for command-line options, arguments and sub-commands — Python 3.10.0 Documentation
Καθορίστε τον τύπο του ορίσματος (type) με argparse
Ένα χρήσιμο χαρακτηριστικό της argparse είναι ο καθορισμός του τύπου (type).
Για παράδειγμα, αν καθορίσετε έναν ακέραιο τύπο (int), θα μετατρέψει αυτόματα το όρισμα σε int και θα δημιουργήσει επίσης ένα σφάλμα για τα ορίσματα που δεν είναι int.
Ο τύπος καθορίζεται από τον τύπο ορίσματος της add_argument().
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('arg_int', type=int)
args = parser.parse_args()
print(args.arg_int)
print(type(args.arg_int))
Εκτελέστε αυτό το αρχείο από τη γραμμή εντολών.
$ python argparse_type_int.py 100
100
<type 'int'>
Το επιχείρημα 100 διαβάζεται ως int.
Εάν χρησιμοποιηθεί ως όρισμα μια τιμή που δεν είναιint, θα εμφανιστεί σφάλμα.
$ python argparse_type_int.py foo
usage: argparse_type_int.py [-h] arg_int
argparse_type_int.py: error: argument arg_int: invalid int value: 'foo'
$ python argparse_type_int.py 1.23
usage: argparse_type_int.py [-h] arg_int
argparse_type_int.py: error: argument arg_int: invalid int value: '1.23'
Πολύ χρήσιμο για την αναπαραγωγή απροσδόκητων επιχειρημάτων.
Μην καθορίζετε «bool» ως τύπο ορίσματος της add_argument()
Είναι σημαντικό να σημειωθεί ότι το bool, όπως και τα int και float, δεν θα λειτουργήσει όπως αναμένεται αν καθορίσετε το bool ως τύπο ορίσματος της add_argument().
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('arg_bool', type=bool)
args = parser.parse_args()
print(args.arg_bool)
print(type(args.arg_bool))
Εκτελέστε αυτό το αρχείο από τη γραμμή εντολών.
$ python argparse_type_bool.py True
True
<type 'bool'>
Εάν το true χρησιμοποιείται ως όρισμα, θα διαβαστεί ως bool τύπου true. Αυτή είναι η αναμενόμενη συμπεριφορά, αλλά το πρόβλημα είναι η ακόλουθη περίπτωση.
$ python argparse_type_bool.py False
True
<type 'bool'>
$ python argparse_type_bool.py bar
True
<type 'bool'>
Αν χρησιμοποιήσετε false ή οποιαδήποτε άλλη συμβολοσειρά ως όρισμα, θα διαβαστεί ως true.
Ο λόγος για τον οποίο συμβαίνει αυτό είναι ότι όταν το type=xxx καθορίζεται στην add_argument(), το όρισμα περνάει στην xxx().
Για παράδειγμα, αν type=int, το όρισμα θα περάσει στην int(), αν type=float, τότε στην float().
Το ίδιο ισχύει και για type=bool, που σημαίνει ότι το όρισμα θα περάσει στην bool().
Κρίση από bool()
Αυτή η bool() είναι δύσκολη.
- bool() — Built-in Functions — Python 3.10.0 Documentation
- Truth Value Testing — Built-in Types — Python 3.10.0 Documentation
Οι ακόλουθες τιμές θεωρούνται ψευδείς:
- None
- false
- Μηδέν σε αριθμητικούς τύπους. Για παράδειγμα, οι ακόλουθες τιμές
- 0
- 0.0
- 0j
- Μια κενή ακολουθία. Για παράδειγμα
- ''
- ()
- []
- Κενή χαρτογράφηση. Για παράδειγμα
- {}
Όλες οι άλλες τιμές θεωρούνται αληθείς – έτσι τα αντικείμενα πολλών τύπων είναι πάντα αληθή. Οι πράξεις και οι ενσωματωμένες συναρτήσεις που επιστρέφουν αποτελέσματα Boolean επιστρέφουν πάντα 0 ή False ως ψευδή τιμή και 1 ή True ως αληθή τιμή, εκτός αν αναφέρεται διαφορετικά.
Επομένως, όλες οι μη κενές συμβολοσειρές που περνούν στην bool(), είτε είναι 'true' είτε 'false', θα επιστρέφουν true. Μόνο οι κενές συμβολοσειρές θα είναι ψευδείς.
print(bool('True'))
print(bool('False'))
print(bool('abc'))
# True
# True
# True
print(bool(''))
# False
Όταν το type=bool ορίζεται στην add_argument(), το όρισμα περνάει στην bool(). Επομένως, όπως φαίνεται στο παραπάνω παράδειγμα, εάν το false χρησιμοποιείται ως όρισμα, θα μετατραπεί από την bool() ως συμβολοσειρά 'False' και θα διαβαστεί ως true.
Χρησιμοποιήστε την ενέργεια του επιχειρήματος αντί για τον τύπο του επιχειρήματος.
Αν θέλετε να χρησιμοποιήσετε τιμές Boolean στο argparse, καθορίστε 'store_true' ή 'store_false' για την ενέργεια argument.
- 'store_true'
- 'store_false'
Αυτές θα είναι ειδικές εκδόσεις της 'store_const' που θα αποθηκεύουν True και False αντίστοιχα. Επιπλέον, θα θέτουν τις προεπιλεγμένες τιμές σε False και True αντίστοιχα, με αυτή τη σειρά.
argparse — Parser for command-line options, arguments and sub-commands — Python 3.10.0 Documentation
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--en', action='store_true')
args = parser.parse_args()
print(args.en)
print(type(args.en))
Σε αυτό το παράδειγμα, δίνονται οι ακόλουθες επιλογές.--en
Επομένως, αν το en δεν έχει οριστεί ως true, θα φορτωθεί ως false, που είναι η προεπιλεγμένη τιμή του en.
$ python argparse_option_bool.py --en
True
<type 'bool'>
$ python argparse_option_bool.py
False
<type 'bool'>
Αν θέλετε να ορίσετε την προεπιλογή σε true και false όταν προστίθεται η επιλογή, κάντε τα εξής.action='store_false'
Χρήση της συνάρτησης strtobool()
Αν θέλετε να χρησιμοποιήσετε ορίσματα θέσης αντί για επιλογές, μπορείτε επίσης να χρησιμοποιήσετε τη συνάρτηση strtobool().
Η strtobool() είναι μια συνάρτηση που μετατρέπει μια συμβολοσειρά σε true (1) ή false (0).
Μετατρέπει μια συμβολοσειρά boolean σε true (1) ή false (0).
Οι πραγματικές τιμές έχουν ως εξής
y
yes
true
on
1
Οι ψευδείς τιμές έχουν ως εξής.
n
no
f
false
off
0
Αν η val δεν είναι κάποιο από τα παραπάνω, τότε προκύπτει ValueError.
9. API Reference – strtobool() — Python 3.10.0 Documentation
Δεν είναι ευαίσθητη στην πεζότητα, οπότε για παράδειγμα, μπορείτε να χρησιμοποιήσετε την ακόλουθη συμβολοσειρά- οποιαδήποτε άλλη συμβολοσειρά θα οδηγήσει σε σφάλμα.
'TRUE'
'True'
'YES'
from distutils.util import strtobool
print(strtobool('true'))
print(strtobool('True'))
print(strtobool('TRUE'))
# 1
# 1
# 1
print(strtobool('t'))
print(strtobool('yes'))
print(strtobool('y'))
print(strtobool('on'))
print(strtobool('1'))
# 1
# 1
# 1
# 1
# 1
print(strtobool('false'))
print(strtobool('False'))
print(strtobool('FALSE'))
# 0
# 0
# 0
print(strtobool('f'))
print(strtobool('no'))
print(strtobool('n'))
print(strtobool('off'))
print(strtobool('0'))
# 0
# 0
# 0
# 0
# 0
# print(strtobool('abc'))
# ValueError: invalid truth value 'abc'
Το όνομα είναι strtobool(), αλλά η τιμή επιστροφής δεν είναι bool, αλλά int (1 ή 0).
print(type(strtobool('true')))
# <class 'int'>
Όπως γράφτηκε προηγουμένως, όταν το type=xxx καθορίζεται στην add_argument() της argparse, το όρισμα θα περάσει στην xxx(). Επομένως, μπορούμε να κάνουμε τα εξής.type=strtobool
import argparse
from distutils.util import strtobool
parser = argparse.ArgumentParser()
parser.add_argument('arg_bool', type=strtobool)
args = parser.parse_args()
print(args.arg_bool)
print(type(args.arg_bool))
Η τιμή επιστροφής δεν είναι ένας τύπος bool, αλλά ένας int τύπου 1 ή 0, αλλά μπορεί να διαβάσει αληθείς ή ψευδείς τιμές με ορίσματα true ή false.
$ python argparse_type_strtobool.py true
1
<type 'int'>
$ python argparse_type_strtobool.py false
0
<type 'int'>
Επίσης, εάν το όρισμα δεν είναι αναμενόμενο, θα δημιουργηθεί ένα σφάλμα.
$ python argparse_type_strtobool.py bar
usage: argparse_type_strtobool.py [-h] arg_bool
argparse_type_strtobool.py: error: argument arg_bool: invalid strtobool value: 'bar'