я следующие коды:Как передать параметр в классе для Argparse факторинга два очень похожих классов
def main(args):
"""
Description of main
"""
print args
if __name__ == '__main__':
class DefaultListAction(argparse.Action):
CHOICES = ['ann','netmhcpan','comblib_sidney2008','consensus','smm','smmpmbec','netmhccons']
def __call__(self, parser, namespace, values, option_string=None):
if values:
for value in values:
if value not in self.CHOICES:
message = ("invalid choice: {0!r} (choose from {1})"
.format(value,
', '.join([repr(action)
for action in self.CHOICES])))
raise argparse.ArgumentError(self, message)
setattr(namespace, self.dest, values)
class DefaultListAction_Frames(argparse.Action):
CHOICES = ['R','F','6']
def __call__(self, parser, namespace, values, option_string=None):
if values:
for value in values:
if value not in self.CHOICES:
message = ("invalid choice: {0!r} (choose from {1})"
.format(value,
', '.join([repr(action)
for action in self.CHOICES])))
raise argparse.ArgumentError(self, message)
setattr(namespace, self.dest, values)
parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawTextHelpFormatter)
parser.add_argument("-iedb",help="IEDB tools options: ann, comblib_sydney2008, consensus, netmhcpan, smm, smmpmbec, netmhccons", \
action=DefaultListAction, nargs='*', default=[''], \
metavar='iedb_tools')
parser.add_argument("-f",help="Frame to translate insert: (F)orward three frames, (R)everse three frames or (6) frames F + B. Default F.", \
action=DefaultListAction_Frames, nargs=1, default=['F'], \
metavar='frames')
args = parser.parse_args()
main(args)
В принципе, есть два argparse.ArgumentParser.add_argument()
, каждый из которых т принимает один из классов в качестве параметра в action
.
Мой вопрос в том, как может факторизовать class DefaultListAction(argparse.Action)
и класс DefaultListAction_Frames(argparse.Action)
, учитывая, что единственные различия между ними - это параметр CHOICES
.
И как я могу передать эти CHOICES
в качестве параметра в argparse.ArgumentParser.add_argument()
'self.choices' должен содержать параметр' choice', указанный в 'add_argument'. См. '__init__' для класса' Action'. 'action.choices' используется в методе' _check_value' и в форматировании справки.Он не используется ни в каком методе 'Action', но я не знаю причин, почему он не может. – hpaulj
@hpaulj: пример пожалуйста. – neversaint