13

Python コードにタプル (SQL クエリからの行) を返すメソッドがあります。3 つのフィールドがあるとしましょう: (jobId、label、username)

関数間で簡単に受け渡しできるように、タプル全体を「job」という変数として渡しています。しかし、最終的にはちょっとしたことをしたいので、次のようなコードを使用しています: (jobId, label, username) = job

しかし、これはメンテナンスの悪夢であることに気付きました。既存のコードをすべて壊さずに新しいフィールドを結果セットに追加することはできないからです。これはどう書けばよかったのでしょうか?

(jobId, label, username) = (job[0], job[1], job[2]) ...しかし、15...20 個のフィールドがある場合、うまくスケーリングされません。

または、SQLクエリの結果をすぐに辞書に変換してそれを渡します(タプルとして開始されるという事実を制御することはできません。それは私にとっては修正されています)

4

9 に答える 9

14

@Staale

より良い方法があります:

job = dict(zip(keys, values))
于 2008-09-03T14:51:48.617 に答える
13

辞書は間違いなくそれを行うための最良の方法だと思います。簡単に拡張でき、各値に適切な名前を付けることができます。Python には、辞書を使用および操作するための組み込みの言語機能が多数あります。後でフィールドを追加する必要がある場合、変更する必要があるのは、タプルを辞書に変換するコードと、新しい値を実際に使用するコードだけです。

例えば:

job={}
job['jobid'], job['label'], job['username']=<querycode>
于 2008-09-03T13:50:24.927 に答える
5

これは古い質問ですが...

この状況では名前付きタプルを使用することをお勧めします: collections.namedtuple

これは、特に役立つと思われる部分です。

サブクラス化は、新しく保存されたフィールドを追加する場合には役に立ちません。代わりに、_fields 属性から新しい名前付きタプル型を作成するだけです。

于 2009-07-17T16:08:40.003 に答える
3

おそらくこれはあなたのケースではやり過ぎですが、タプルをコンストラクター引数として受け取り、それぞれのプロパティを持つ「ジョブ」クラスを作成したくなるでしょう。次に、代わりにこのクラスのインスタンスを渡します。

于 2008-09-03T13:57:15.923 に答える
2

私なら辞書を使います。この方法でタプルを辞書に変換できます。

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自身で新鮮なので、これを行うより良い方法があるかもしれません.

于 2008-09-03T13:59:28.133 に答える
2

古い質問ですが、誰も言及していないので、Pythonクックブックからこれを追加します:

レシピ 81252: 柔軟なクエリ結果アクセスに dtuple を使用する

このレシピは、データベースの結果を処理するために特別に設計されており、dtuple ソリューションを使用すると、名前またはインデックス番号で結果にアクセスできます。これにより、質問に記載されているように、維持するのが非常に難しい添え字ですべてにアクセスする必要がなくなります。

于 2008-12-22T20:22:43.033 に答える
0

タプルを使用すると、フィールドを追加または変更するのは常に面倒です。辞書の方がはるかに優れていることは間違いありません。

少し親しみやすい構文が必要な場合は、単純な「構造体のような」オブジェクトに関するこの質問への回答を参照してください。こうすることで、たとえばjob、オブジェクトを渡したり、タプルや dict よりも簡単にそのフィールドにアクセスしたりできます。

job.jobId, job.username = jobId, username
于 2008-09-03T13:51:53.160 に答える
0

MySQLdb パッケージを使用している場合は、タプルの代わりに辞書を返すようにカーソル オブジェクトを設定できます。

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
于 2010-04-09T16:28:06.313 に答える
-2

これはどう:

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__メソッドを編集するだけです! スターレのような何か。

于 2008-09-03T14:02:37.300 に答える