2014-03-13 9 views
0

입력 매개 변수 중 하나가 문자열 인 Python 함수 (2.7)를 작성했습니다. 문자열 값은 몇 가지 값 중 하나 여야합니다. 매개 변수 즉 함수 입력 파이썬에 대한 문자열 옵션

가,이 경우 "일종의"목록 [ '주 저자' '마지막 저자의'제목 ']에서 하나가 될 수

편안한 있는가 (목록은 더 이상 조금 실제로) 사용자가이 입력을 (탭 완성을 통해) 제공하도록 돕는 방법. 궁극적 인 목표는 사용자 인터페이스를 개선하고 개선하여 코드를 사용하고 실수를 줄이는 것이 더 쉽습니다.

옵션 1 : 정의 상수

이 최선의 선택이 될 수 있지만이 일을 여러 가지 방법이 있습니다. 내 접근 방식은 아래와 같습니다.

함수가 상주하는 모듈에서 상수를 만드는 것을 고려하고 있지만 이것은 어수선해 보입니다. 내 현재의 해결책은 옵션이있는 클래스를 포함하는 것이지만, 속임수를 쓰지 않고 무의미하고 짧게 만드는 것이 아니라면 입력을 실제로 길게 만든다 (이것은 내가 한 일이지만 잘못되었거나 분명한 것처럼 보인다). 어떻게해야합니까?

옵션 2 : 비아 해석 문서

참고 : 나는

내가 편집자 수행하는 데 사용할 수있는 문서에 코드를 삽입의 아이디어를 좋아 ...이 옵션은 실제로 존재 생각하지 않는다 탭 완료,하지만 난이 옵션이 기존의 인식하지 못합니다.

다른 옵션은 있습니까?

현재 코드 (약) :

class C(): 
    SORT_FIRST_AUTHOR = 'first author' 
    SORT_LAST_AUTHOR = 'last author' 
    SORT_TITLE  = 'title' 

#Ideally these might be selected by: my_module.search.sort_option.FIRST_AUTHOR instead of my_module.C.FIRST_AUTHOR but that's REALLY long 


def search(query_string,sort = None): #Changed sort = [], to sort = None per comments 

UPDATE :

이 내가 생각하지만 대답은 난 것과 분기,이 질문에 다소 유사하다 (질문을 명확히하기 위해 노력) 질문의 특성 때문에 찾고 있습니다.

Pythonic way to have a choice of 2-3 options as an argument to a function

이상적으로, 내가 가진 사양에서 "종류"에 탭 완성 할 수 있도록 검색()의 정의를 좋아하는 것, 무엇인가 :

def search(....): 
    """ 
    :param sort: 
    :values sort: 'first author'|'last author'|'title' 
    """ 

, 나는 잘 모르는 것 같아요 실제로 유효한 문서 옵션입니다.

대안 내가 호출이되도록이 수 몇 가지 상수를 정의 할 수 있습니다 :

검색 (my_a, my_b, package_name.C.SORT_FIRST_AUTHOR)

그러나이 추하고 잘못된 것 같다.

그래서 사용자가 일련의 옵션 중에서 하나를 전달하도록하려면 어떻게해야합니까?

+3

처음에는'[]]을'sort'의 기본값으로 사용하지 마십시오. [이유] 때문에 (http://stackoverflow.com/questions/1132941/least-astonishment-in-python-the- mutable-default-argument). – roippi

+1

그것은 나만인가, 아니면 당신이 무엇을 요구하고 있는지 분명하지 않은가? –

+0

@roippi이 호출은 서버로 전송됩니다. http 요청에서 매개 변수를 생략하면 기본값을 사용해야 함을 나타냅니다. – Jimbo

답변

1

문자열 리터럴을 올바르게 입력하기 위해 사용자에게 의존하는 것은 문자열에 오타가 포함되어 있으면 자동 오류가 발생할 수 있으므로 일반적으로 좋지 않습니다.

예를 들어 소켓 모듈은 이러한 매개 변수로 함수에 전달되는

socket.SOCK_STREAM 
socket.SOCK_DGRAM 
socket.SOCK_RAW 

을 가지고 있으며, 쉽게 문자열 값을 포함 할 수있다, 모듈 수준에서 대문자 변수를 정의하는 것이 일반적입니다.

은 "이상적으로 이들은 선택할 수 있습니다 my_module.search.sort_option.FIRST_AUTHOR 대신 my_module.C.FIRST_AUTHOR의하지만 그건 정말 길다"

예 첫 번째 옵션은 조금 긴 것 같다. mymodule.SORT_FIRST_AUTHOR은 합리적인 것처럼 보이고, 상수가 해당 클래스로 제한되거나 클래스가 모듈에서 독립적으로 가져 오기 쉬운 경우 클래스 변수를 사용하는 것이 적절할 수 있습니다. (SORT 같은) 공통의 용어와 상수를 앞에 덧붙이

from mymodule import Searcher 
s = Searcher(..., Searcher.SORT_FIRST_AUTHOR) 

것이다 보좌관 편집기 탭 항목을 완료하고 상수가 더 설명한다.

또한 그러나 나는 이것이 대부분의 편집기에서 탭 완성 작동합니다 생각하지 않습니다,이 변경되는 속성을 보호하는 장점이있는 namedtuple

>>> SortOpts = namedtuple('SortOpts', ('FIRST_AUTHOR', 'LAST_AUTHOR')) 
>>> SORT_OPT = SortOpts(FIRST_AUTHOR=0, LAST_AUTHOR=1) 
>>> SORT_OPT.FIRST_AUTHOR 
0 
>>> SORT_OPT.FIRST_AUTHOR = 2 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: can't set attribute 

사용을 고려할 수 있습니다.

+0

여기에 핵심 아이디어는 아마도 새로운 검색 클래스의 메서드로 내 기능을 홍보하는 것입니다 생각합니다. 이것은 모듈이나 다른 어색한 상수 클래스 대신에 클래스의 상수를 숨길 수 있습니다. 감사! – Jimbo

+0

그게 응용 프로그램에 대한 이해가된다면 - 그러나 사용자로서, 가능한 경우 모듈을 호출하여 클래스를 인스턴스화하지 않고 모듈 수준에서 함수를 사용하는 것을 선호합니다. 당신은 최선의 판단을 내리는 사람입니다. –