2013-11-01 3 views
0

필자는 함수가 문자열이나 list-of-string 중 하나를 입력으로 받아들이고 동일한 형식을 반환하기를 원하는 함수를 작성하고 있습니다.파이썬 "문자열 또는 문자열 목록"형식 규칙?

나는 이것에 대한 몇 가지 접근법을 생각해 보았지만, 둘 다 서투른 것처럼 보인다. 각 개념 함수에 대해 다음과 같이 쓸 수 있습니다.

  • 문자열과 문자열 목록에 대한 별도의 함수입니다. 그러나이를 위해서는 호출 코드가 변수의 유형을 알고 적절한 함수를 선택해야합니다.
  • 'isinstance (inputarg, str) :'을 사용하여 입력 유형을 감지하여 수행 할 작업을 결정하는 함수는 하나뿐입니다. 적어도 호출자 대신 라이브러리 안의 여러 선택 항목을 숨 깁니다.

하지만 제가 간과했던 좀 더 우아한 접근 방식이나 숙어가 있는지 궁금합니다.

설명 :이 두 가지 솔루션 중 두 번째는 문자열 또는 list-of-string을 허용 (및 반환)하는 정도에 다형성이있는 단일 함수를 만드는 것이 훨씬 더 좋습니다. 그러나이 경우에도 isinstance()을 기반으로하는 전환은 아마도 더 나은 대안을 가진 부끄러운 것처럼 보입니다.

+0

단일 값을 이러한 값의 시퀀스로 취급하는 경우는 드뭅니다.보다 구체적인 예를 제공 할 수 있습니까? – user2864740

+0

문자열의 목록이 단일 문자열에 대해 사용 된 논리를 목록의 각 요소에 적용하는 것 이외의 다른 작업을 수행합니까? 아마도 결과 값 목록을 반환 할 수 있습니까? – SingleNegationElimination

+0

완전하기 만하면 두 개의 args (각 유형 중 하나)를 사용하고 None이 아닌 것을 사용하는 함수를 가질 수 있습니다. 그러나 나는 그것이 "우아한"테스트에 실패했다고 생각합니다. :-) 예상되는 사용법에 따라, varargs가 합리적 일 수 있습니다. 나는 두 가지 접근 방식 모두를 좋아합니다. 메소드의 이름을 지정하고 args를 멋지게 지정하십시오. –

답변

1

isinstance is OK.

문자열 (및 목록이 아님)에 대해 필요한 몇 가지 메서드가 있는지 테스트하고 목록이 아닌 (문자열이 아닌) 몇 가지 메서드를 다시 테스트하는 것이 좋습니다. 둘 다 가지지 않으면 AssertionError를 발생시키는 것이 좋습니다.

hasattr()을 사용하여 메소드를 테스트 할 수 있습니다.

+0

문자열 *은 문자열 시퀀스입니다. 따라서'tuple'과 같은 다른 종류의 시퀀스가 ​​아니라'list' 일 필요가 없다는 것이 확실하지 않다면, 시퀀스가 ​​아닌 문자열에 필요한 몇 가지 메소드를 실제로 테스트 할 수 없습니다. 문자열의 다른 시퀀스가 ​​아닌 다른 방법을 테스트 할 수 있습니다. 물론, 이상적으로 문자열의 일부 함수가 있습니다. * 입력이 문자열 일 때 실제로 사용합니다.이 경우에는 문자열을 사용할 때 예외를 catch하고 사용하면됩니다. 일련의 문자열. –

+0

설명 : string = 문자 시퀀스 (즉, 문자열 시퀀스가 ​​아님). 또한, @ dstromberg의 생각은리스트의 메소드를 테스트하는 것은 문자열을 체크 한 후에 할 수있다. 그러나 처음에 시퀀스를 확인하면 원하지 않는 문자열을 받아 들일 것입니다. – gwideman

1

나는 문자열의 반복성을 취하는 단 하나의 함수 만 갖고 싶어합니다. 단일 문자열 s으로 호출해야하는 경우 항상 f([s]) 또는 f((s,))으로 호출 할 수 있습니다.

+0

추가 접근법이지만, 여전히 호출자가 s의 유형을 알아야하고 string vs list-of-string에 대해 f()를 다르게 호출해야합니다. – gwideman

+0

@gwideman : 문제를 호출 스택 위로, 즉 호출자의 호출자에게 푸시합니다. :) – NPE

+0

@gwideman 일반적으로 모든 변수의 유형 (모듈로 하위 및 오리 타이핑)을 알고 있습니다. 그 지식 없이는 많은 유용한 코드를 작성할 수 없습니다. 발신자에 관해 특별한 것이있어 유형을 모를 가능성이 있습니까? – delnan