(제목과 알렉스의 대답 읽은 후 업데이트 된 내용) 일반적으로입력에 따라 iterable 또는 iterable이 아닌 함수를 반환하는 Pythonic입니까?
을 나는 그것이 때때로 반복 가능한 및 해당 매개 변수에 따라 때로는 단일 항목을 반환하는 기능에 나쁜 형태 (UN-파이썬) 간주 있다고 생각합니다.
예를 들어 struct.unpack
은 하나의 항목 만 포함하는 경우에도 항상 튜플을 반환합니다.
나는 모듈에 대한 API를 마무리하기 위해 노력하고있어 나는 이런 (*args
를 통해) 하나 개 이상의 매개 변수를 취할 수있는 몇 가지 기능이 :이 있다면
a = s.read(10) # reads 10 bits and returns a single item
b, c = s.read(5, 5) # reads 5 bits twice and returns a list of two items.
따라서는 단일 항목을 반환합니다 하나의 매개 변수 만 그렇지 않으면 목록을 반환합니다. 이제는 이것이 잘되고 혼란스럽지 않다고 생각하지만, 다른 사람들이 동의하지 않을 수도 있습니다.
는 는 이 기능의 가장 일반적인 사용 사례는 그래서 항상 목록을 반환 (또는 튜플), 단일 항목을 반환하려는 경우에만하는 것입니다잘못 느낌 :
a, = s.read(10) # Prone to bugs when people forget to unpack the object
a = s.read(10)[0] # Ugly and it's not clear only one item is being returned
또 다른 옵션은 두 가지 기능을하는 것입니다 :
a = s.read(10)
b, c = s.read_list(5, 5)
OK입니다
하지만 클러 위로 API를하고 어떤 가치를 추가하지 않고 두 배나 많은 기능을 기억하는 사용자가 필요합니다.
제 질문은 : 때로는 반복 가능하고 때로는 단일 항목이 혼란 스럽거나 피톤이 아닌 것을 반환합니까? 그렇다면 무엇이 최선의 선택입니까?
업데이트 : 나는 일반적인 합의는 단지 가끔 반복자를 반환에 매우 나쁜 있다고 생각합니다. 대부분의 경우 가장 좋은 옵션은 하나의 항목 만 포함되어 있어도 iterable을 항상 반환하는 것입니다.
내 특수한 경우에 대해 두 가지 기능 (read(item)
/readlist(*items)
)으로 나눌 것이라고 생각합니다. 이유는 단일 항목의 경우가 여러 항목의 경우보다 훨씬 자주 발생한다고 생각합니다. 따라서 사용하기가 더 쉬워지고 API는 사용자에게 덜 문제가됩니다.
모두에게 감사드립니다. 파이썬 목록에서
+1. 때로는 일이되고 때로는 일종의 목록이되는 것이 일반적으로 실수입니다. 파이썬은 % -formatting을 위해 이런 일을했는데, 이것은 널리 실수와 불쾌한 함정으로 간주됩니다. – bobince
나는 사람들이 이것을 말할 까봐 두려웠다. 분명히 단 하나의 아이템에 대해서만 요구했을 때리스트를 얻는 것은 추한 것처럼 느껴졌다. –
@Scot Griffiths : IMHO 간단한 변수가 초래할 수있는 문제를 너무 영리하게 외면함으로써 생기는 잠재적 인 버그. '* args'를 사용하는 대신 'def read (a_tuple) : '과 같은 메소드를 사용하지 않는 이유는 무엇입니까? – voyager