문제

Python 코드에는 SQL 쿼리의 행인 튜플을 반환하는 메서드가 있습니다.여기에 세 개의 필드가 있다고 가정해 보겠습니다.(작업 ID, 라벨, 사용자 이름)

함수 간에 쉽게 전달할 수 있도록 전체 튜플을 'job'이라는 변수로 전달했습니다.그러나 결국에는 비트를 확인하고 싶어서 다음과 같은 코드를 사용했습니다.(작업 ID, 라벨, 사용자 이름) = 작업

그러나 나는 이것이 유지 관리의 악몽이라는 것을 깨달았습니다. 이제 기존 코드를 모두 손상시키지 않고는 결과 집합에 새 필드를 추가할 수 없기 때문입니다.이걸 어떻게 썼어야 했나요?

제가 추측한 두 가지 추측은 다음과 같습니다.(jobid, label, username) = (job [0], job [1], job [2]) ...하지만 15 ... 20 필드가있을 때는 잘 확정되지 않습니다.

또는 SQL 쿼리의 결과를 즉시 사전으로 변환하고 전달합니다. (튜플로 시작한다는 사실을 제어할 수 없습니다. 이는 해결되었습니다.)

도움이 되었습니까?

해결책

나는 사전이 확실히 그것을 할 수 있는 가장 좋은 방법이라고 말하고 싶습니다.확장이 쉽고, 각 값에 적절한 이름을 지정할 수 있으며, Python에는 사전을 사용하고 조작하기 위한 많은 내장 언어 기능이 있습니다.나중에 더 많은 필드를 추가해야 하는 경우 튜플을 사전으로 변환하는 코드와 실제로 새 값을 사용하는 코드만 변경하면 됩니다.

예를 들어:

job={}
job['jobid'], job['label'], job['username']=<querycode>

다른 팁

@스탈레

더 좋은 방법이 있습니다:

job = dict(zip(keys, values))

오래된 질문이지만...

이 상황에서는 명명된 튜플을 사용하는 것이 좋습니다. collections.namedtuple

특히 유용하다고 생각되는 부분은 다음과 같습니다.

서브클래싱은 새로운 저장된 필드를 추가하는 데 유용하지 않습니다.대신 _fields 속성에서 새로운 명명된 튜플 유형을 생성하기만 하면 됩니다.

아마도 이것은 귀하의 경우에는 과잉일 수 있지만, 튜플을 생성자 인수로 사용하고 그에 대한 각각의 속성을 갖는 "Job" 클래스를 만들고 싶은 유혹을 느낄 것입니다.그런 다음 이 클래스의 인스턴스를 대신 전달합니다.

나는 사전을 사용할 것이다.다음과 같은 방법으로 튜플을 사전으로 변환할 수 있습니다.

values = <querycode>
keys = ["jobid", "label", "username"]
job = dict([[keys[i], values [i]] for i in xrange(len(values ))])

그러면 먼저 [["jobid", val1], ["label", val2], ["username", val3]] 배열이 생성된 다음 이를 사전으로 변환합니다.결과 순서나 개수가 변경되면 새 결과와 일치하도록 키 목록을 변경하기만 하면 됩니다.

PS는 아직 Python에 익숙하므로 이 작업을 수행하는 더 좋은 방법이 있을 수 있습니다.

오래된 질문이지만 아무도 언급하지 않았기 때문에 Python Cookbook에서 다음을 추가하겠습니다.

레시피 81252:유연한 쿼리 결과 액세스를 위해 dtuple 사용

이 레시피는 데이터베이스 결과를 처리하기 위해 특별히 설계되었으며 dtuple 솔루션을 사용하면 이름 또는 인덱스 번호로 결과에 액세스할 수 있습니다.이렇게 하면 귀하의 질문에 언급된 것처럼 유지 관리가 매우 어려운 첨자로 모든 항목에 액세스할 필요가 없습니다.

튜플을 사용하면 필드를 추가하거나 변경하는 것이 항상 번거롭습니다.사전이 훨씬 더 좋을 것이라는 말씀이 맞습니다.

약간 더 친숙한 구문을 원한다면 답변을 살펴보는 것이 좋습니다. 이 질문 간단한 '구조체 같은' 객체에 대해.그렇게 하면 객체를 전달할 수 있습니다. job, 튜플이나 딕셔너리보다 훨씬 쉽게 해당 필드에 액세스할 수 있습니다.

job.jobId, job.username = jobId, username

MySQLdb 패키지를 사용하는 경우 튜플 대신 dict를 반환하도록 커서 개체를 설정할 수 있습니다.

import MySQLdb, MySQLdb.cursors
conn = MySQLdb.connect(..., cursorclass=MySQLdb.cursors.DictCursor)
cur = conn.cursor() # a DictCursor
cur2 = conn.cursor(cursorclass=MySQLdb.cursors.Cursor) # a "normal" tuple cursor

이건 어때:

class TypedTuple:
    def __init__(self, fieldlist, items):
       self.fieldlist = fieldlist
       self.items = items
    def __getattr__(self, field):
       return self.items[self.fieldlist.index(field)]

그런 다음 다음을 수행할 수 있습니다.

j = TypedTuple(["jobid", "label", "username"], job)
print j.jobid

교환이 쉬워야 한다 self.fieldlist.index(field) 나중에 사전 검색으로...그냥 편집해 __init__ 방법!Staale과 같은 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top