2014-02-21 1 views
0

여러 스크립트에 일반 파서를 사용하고 싶습니다. 따라서 코드 정리를 위해 모든 공통 인수를 처리 할 수있는 장소를 하나 갖고 싶습니다. ArgumentParser를 하위 클래스 화하여이 작업을 수행 할 수 있지만 그룹을 추가하는 문제가 발생했습니다. 그룹을 추가하면 더 이상 내가 작성한 사용자 정의 메소드에 액세스 할 수 없습니다. 이 문제를 해결하기 위해 기본적으로 add_argument_group 메소드를 복사하고 추가 기능을 추가했습니다. 나는 이것이 끔찍한 해결책이라는 것을 잘 알고 있으며, 이것을 올바르게 달성하는 방법에 대한 조언은 무엇입니까?argparse 및 overriding add_argument_group

class CustomParser(argparse.ArgumentParser): 
    def __init__(self, *args, **kwrds): 
     super(CustomParser, self).__init__(*args, **kwrds) 

    def add_enzyme(self): 
     self.add_argument('--enzyme', help="The enzyme to cleave with. Also valid is a" 
              " cleavage pattern such as [KR]|{P}.", 
          choices=protein_config.ENZYMES.keys(), type=str, default='trypsin') 

    def add_fasta(self, help="The fasta file to operate on."): 
     self.add_argument('-f', '--fasta', nargs='?', help=help, type=argparse.FileType('r'), default=sys.stdin) 

    def add_out(self, help='The file to write results to. Leave blank for stdout,'): 
     self.add_argument('-o', '--out', nargs='?', help=help, type=argparse.FileType('w'), default=sys.stdout) 

    def add_argument_group(self, *args, **kwargs): 
     group = argparse._ArgumentGroup(self, *args, **kwargs) 
     self._action_groups.append(group) 
     group.add_enzyme = self.add_enzyme 
     group.add_fasta = self.add_fasta 
     group.add_out = self.add_out 
     return group 
+0

만 (add_argument_group에서) 그룹에 연결된 사용자의 세 가지 추가 방법이며 CustomParser에서 사용되지 생산? – deinonychusaur

답변

0

이 같은 동적 그룹 방법을 추가 : 나는 당신의 의존성을 가지고 있지 않기 때문에 정말 테스트 할 수 없습니다, 작동

from types import MethodType 

class CustomParser(argparse.ArgumentParser): 
    def __init__(self, *args, **kwrds): 
     super(CustomParser, self).__init__(*args, **kwrds) 

    def add_argument_group(self, *args, **kwargs): 

     def add_enzyme(self): 
      self.add_argument(
       '--enzyme', 
       help="The enzyme to cleave with. Also valid is a" 
       " cleavage pattern such as [KR]|{P}.", 
       choices=protein_config.ENZYMES.keys(), type=str, default='trypsin') 

     def add_fasta(self, help="The fasta file to operate on."): 
      self.add_argument(
       '-f', '--fasta', nargs='?', help=help, type=argparse.FileType('r'), 
       default=sys.stdin) 

     def add_out(self, help='The file to write results to. Leave blank for stdout,'): 
      self.add_argument(
       '-o', '--out', nargs='?', help=help, type=argparse.FileType('w'), 
       default=sys.stdout) 

     group = super(CustomParser, self).add_argument_group(*args, **kwargs) 
     setattr(group, add_enzyme.__name__, MethodType(add_enzyme, group, type(group))) 
     setattr(group, add_fasta.__name__, MethodType(add_fasta, group, type(group))) 
     setattr(group, add_out.__name__, MethodType(add_out, group, type(group))) 

     #self._action_groups.append(group) 

     return group 

생각합니다. 그리고 그것이 당신이 필요로했던 것이기를 바랍니다. 나는 적절한 슈퍼 콜 때문에 필요할 필요가 없다고 생각하기 때문에 self._action_groups.append으로 전화를했다.

+0

argument_group이 부모 메소드를 가질 수있는 일반적인 상속 솔루션을 원했지만 _ArgumentGroup 자체가 작동하는 것처럼 보입니다. – Chrismit

+0

정확히 무엇을 의미하는지 확실하지 않습니다. 무엇이 부족합니까? – deinonychusaur

0

parents 파서를 사용해 보셨습니까?

import argparse 

parent = argparse.ArgumentParser(add_help=False) 
group = parent.add_argument_group('standard') 
group.add_argument('--enzyme', help="The enzyme to cleave with") 
group.add_argument('-f', '--fasta', nargs='?', help='help') 
group.add_argument('-o', '--out', nargs='?',type=argparse.FileType('w')) 

parser = argparse.ArgumentParser(parents=[parent]) 
parser.add_argument('--custom') 
parser.print_help() 

usage: stack21938846.py [-h] [--enzyme ENZYME] [-f [FASTA]] [-o [OUT]] 
         [--custom CUSTOM] 

optional arguments: 
    -h, --help   show this help message and exit 
    --custom CUSTOM 

standard: 
    --enzyme ENZYME  The enzyme to cleave with 
    -f [FASTA], --fasta [FASTA] 
         help 
    -o [OUT], --out [OUT]