Twój test sprawdzania końcowego jest w porządku, zwłaszcza jeśli testowanie domyślne z is None
odpowiada Twoim potrzebom.
http://bugs.python.org/issue11588'Add "necessarily inclusive" groups to argparse'
analizuje implementację takich testów za pomocą mechanizmu groups
(generalizacja mutuall_exclusive_groups).
Pisałem zestaw UsageGroups
które wdrażają testy jak xor
(wykluczają się wzajemnie), and
, or
i not
. Myślałem, że są one wszechstronne, ale nie byłem w stanie wyrazić waszej sprawy w kategoriach tych operacji. (wygląda na to, że potrzebuję nand
- nie i zobacz poniżej)
Ten skrypt używa niestandardowej klasy Test
, która zasadniczo implementuje test końcowy. seen_actions
to lista akcji, które zostały przeanalizowane.
class Test(argparse.UsageGroup):
def _add_test(self):
self.usage = '(if --argument then -a and -b are required)'
def testfn(parser, seen_actions, *vargs, **kwargs):
"custom error"
actions = self._group_actions
if actions[0] in seen_actions:
if actions[1] not in seen_actions or actions[2] not in seen_actions:
msg = '%s - 2nd and 3rd required with 1st'
self.raise_error(parser, msg)
return True
self.testfn = testfn
self.dest = 'Test'
p = argparse.ArgumentParser(formatter_class=argparse.UsageGroupHelpFormatter)
g1 = p.add_usage_group(kind=Test)
g1.add_argument('--argument')
g1.add_argument('-a')
g1.add_argument('-b')
print(p.parse_args())
Przykładowe wyjście jest:
1646:~/mypy/argdev/usage_groups$ python3 issue25626109.py --arg=1 -a1
usage: issue25626109.py [-h] [--argument ARGUMENT] [-a A] [-b B]
(if --argument then -a and -b are required)
issue25626109.py: error: group Test: argument, a, b - 2nd and 3rd required with 1st
usage
komunikaty o błędach i nadal wymaga pracy. I nie robi niczego, czego nie może przeprowadzić test po parsowaniu.
Twój test wzbudza błąd, jeśli (argument & (!a or !b))
. Odwrotnie, dozwolone jest !(argument & (!a or !b)) = !(argument & !(a and b))
.Dodając test nand
do moich UsageGroup
zajęciach, mogę realizować swoje sprawy jak:
p = argparse.ArgumentParser(formatter_class=argparse.UsageGroupHelpFormatter)
g1 = p.add_usage_group(kind='nand', dest='nand1')
arg = g1.add_argument('--arg', metavar='C')
g11 = g1.add_usage_group(kind='nand', dest='nand2')
g11.add_argument('-a')
g11.add_argument('-b')
Stosowanie się (za pomocą !()
oznaczyć test 'NAND'):
usage: issue25626109.py [-h] !(--arg C & !(-a A & -b B))
myślę, że to jest najkrótszy i najczystszy sposób wyrażenia tego problemu za pomocą grup ogólnego przeznaczenia.
W moich testach, wejść, które są z powodzeniem zanalizować:
''
'-a1'
'-a1 -b2'
'--arg=3 -a1 -b2'
Ones, które powinny podnieść błędy to:
'--arg=3'
'--arg=3 -a1'
'--arg=3 -b2'
Czy spojrzałeś na "argumenty argparse"? Pozwalają ci na takie rzeczy jak '$ git commit' lub '$ git merge . –
Joel, dzięki za komentarz. Widziałem aspekt akapitu argparse, ale miałem nadzieję, że zrobię to bez argumentów pozycyjnych. Jeśli to jedyny sposób, ale to nie jest wielka sprawa – DJMcCarthy12
Czy '--a' i' --b' mogą być podawane niezależnie? – hpaulj