هل هناك على أي حال لإقناع GetOpt من Python للتعامل مع المعلمات الاختيارية للخيارات؟
-
20-09-2019 - |
سؤال
وفقا لوثائق بيثون getopt
(أعتقد) يجب أن تتصرف حقول الخيارات كـ getopt()
وظيفة. ومع ذلك ، لا يمكنني تمكين معلمات اختيارية من الكود الخاص بي:
#!/usr/bin/python
import sys,getopt
if __name__ == "__main__":
try:
opts, args = getopt.gnu_getopt(sys.argv[1:], "v::", ["verbose="])
except getopt.GetoptError, err:
print str(err)
sys.exit(1)
for o,a in opts:
if o in ("-v", "--verbose"):
if a:
verbose=int(a)
else:
verbose=1
print "verbosity is %d" % (verbose)
النتائج في:
$ ./testopt.py -v
option -v requires argument
$ ./testopt.py -v 1
verbosity is 1
المحلول
getopt
لا تدعم المعلمات الاختيارية. في حالة خيار طويل يمكنك القيام به:
$ ./testopt.py --verbose=
مما سيؤدي إلى قيمة السلسلة الفارغة.
يمكن أن تجد argparse
وحدة لتكون أكثر مرونة.
نصائح أخرى
لسوء الحظ ، لا توجد طريقة. من مستندات optparse:
عادة ، يأخذ خيار معين إما وسيطة أو لا. يريد الكثير من الأشخاص ميزة "حجج الخيار الاختيارية" ، مما يعني أن بعض الخيارات ستتخذ وسيطة إذا رأوا ذلك ، ولم يفعلوا إذا لم يفعلوا ذلك. هذا أمر مثير للجدل إلى حد ما ، لأنه يجعل تحليل التحليل غامضًا: إذا كان "-a" يأخذ حجة اختيارية و "-b" هو خيار آخر تمامًا ، كيف يمكننا تفسير "-AB"؟ بسبب هذا الغموض ، لا يدعم OptParse هذه الميزة.
تعديل: عفوًا ، أي لوحدة OptParse ، وليس وحدة GetOpt ، ولكن السبب الذي يجعل السبب الذي يجعل أي وحدة من الوسائط الاختيارية "هو نفسه بالنسبة لكليهما.
يمكنك القيام بمعلمة اختيارية مع GetOpt مثل هذا:
import getopt
import sys
longopts, shortopts = getopt.getopt(sys.argv[1:], shortopts='', longopts=['env='])
argDict = dict(longopts)
if argDict.has_key('--env') and argDict['--env'] == 'prod':
print "production"
else:
print "sandbox"
الاستخدام:
$ python scratch.py --env=prod
production
$ python scratch.py --env=dev
sandbox
$ python scratch.py
sandbox
إذا كنت تستخدم الإصدار 2.3 أو لاحقًا ، فقد ترغب في تجربة optparse الوحدة النمطية بدلاً من ذلك ، لأنها "أكثر ملاءمة ومرونة وقوية ..." ، وكذلك الأحدث. للأسف ، كما أجاب Pynt ، لا يبدو من الممكن الحصول على ما تريده بالضبط.
يجب أن تدعم GetOpt من Python Args اختياريًا ، مثل GNU getOpt من خلال طلب "=" عند تحديد معلمة. الآن يمكنك محاكاة ذلك بسهولة تامة ، مع هذا القيد من خلال التغيير الضمني -الاختصار إلى -الاختصار =
أي يمكنك تحديد أن -الاختصار يتطلب وسيطة ، ثم ضبط -خيار -الاختصار = على النحو التالي:
for i, opt in enumerate(sys.argv):
if opt == '--option':
sys.argv[i] = '--option='
elif opt == '--':
break