2014-05-23 2 views
2

다른 인수로 인수를 argparse로 변환하고 싶습니다. 아이디어는 숫자 (일반적으로 float)를 전달하고이를 문자열 (일반적으로 float의 Fortran 표기법)로 변환하는 것입니다.argparse의 기본 인수에 대한 사용자 정의 유형 또는 동작

첫째, 나는 그것은 잘 작동 ... 내가 실제로 --xmin= 인수를 주면 사용자 정의 형

def FortranFloat(value): 
    vfloat = float(value) 
    vfloat = str(vfloat) + "d0" 
    return vfloat 

parser = argparse.ArgumentParser() 
parser.add_argument("--xmin=", dest="xmin", type=FortranFloat, default=-2.0) 
args = parser.parse_args() 

을 만들려고. 그렇지 않으면 -2.0을 그대로두고 -2.0d0으로 변환하지 않고 그대로 유지합니다. 그래서 저는이 기본값에게 내가 원하는 형식을 제공하기 쉬울 수 있다고 생각, 그래서 충돌과 같은 오류가 발생하기 때문에 '2.0d0'에 의해 2.0 교체 ... 재미있는 것은,이 평가된다는 점이다

argparse.ArgumentError: argument --xmin=: invalid FortranFloat value: '-2.0d0' 

이 문제를 해결하기 위해 사용자 지정 작업을 만들려고했습니다.

class FortranConverter(argparse.Action): 
    def __call__(self, parser, namespace, values, option_strings=None): 
     if type(values) is float: 
      values = str(values) + "d0" 
      setattr(args, self.dest, values) 

parser = argparse.ArgumentParser() 
parser.add_argument("--xmin=", dest="xmin", type=float, default=-2.0, action=FortranConverter) 
args = parser.parse_args() 

그 중 하나도 작동하지 않았습니다. 내 작업을 수행하는 것조차 보이지 않습니다. (__call__에있는 내용을 인쇄하면 그냥 무시할 것입니다).

어떤 생각, 아이디어 또는 설명 감사하겠습니다!

답변

5

default이 문자열 인 경우 type 함수를 전달합니다. 다른 것은 그대로 사용됩니다 : setattr(namespace, dest, default). '-2.0'시도해 보셨습니까? FortranFloat은 '-2.0d0'으로 변환해야합니다.

또 다른 옵션은 FortranFloat을 수정하여 'd0'이 포함 된 문자열을 인식하고 변경되지 않은 채로 전달합니다.

인수 문자열은 으로 전달되기 전에 type을 통해 전달됩니다. 코드를 올바르게 기억하면 defaultaction을 절대 통과하지 못합니다. 그것은 직접 설정됩니다.

당신은 필요하지 않지만, 일에, 당신의 FortranConverter 기능 setattr(namespace, self.dest, values)를 사용해야합니다.

nargs=0으로 무엇을하려 했습니까? 'store_true'와 같은 작업은 인수를 사용하지 않는다는 것을 나타 내기 위해이를 사용합니다. 그렇지 않으면 프로그래머에게 유용한 값이 아닙니다.

+0

단순히 '-2.0'을 넣는 것이 효과적이며 '-2.0d0'과 반대되는 것은 유형 충돌이 없기 때문입니다. 'nargs = 0' 것은 사용자 정의 액션과 관련된 질문을 너무 빠르게 읽었 기 때문입니다 (실제로 인자가없는 경우). – MBR

관련 문제