質問

Python コードには、SQL クエリからの行であるタプルを返すメソッドがあります。3 つのフィールドがあるとします。(ジョブID、ラベル、ユーザー名)

関数間での受け渡しを容易にするために、タプル全体を「job」という変数として渡しています。ただし、最終的には要点を理解したいので、次のようなコードを使用しています。(jobId、ラベル、ユーザー名) = ジョブ

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

私の最も有力な推測は次の 2 つです。(jobid、label、username)=(job [0]、job [1]、job [2])...しかし、15個のフィールドがある場合はうまく拡張しません

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

役に立ちましたか?

解決

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

例えば:

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

他のヒント

@スターレ

もっと良い方法があります:

job = dict(zip(keys, values))

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

この状況では名前付きタプルを使用することをお勧めします。 コレクション.名前付きタプル

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

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

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

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

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 クックブックからこれを追加します。

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

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

タプルの場合、フィールドの追加や変更は常に面倒です。辞書のほうがはるかに優れているというのは正しいです。

もう少しわかりやすい構文が必要な場合は、回答を見てみるとよいでしょう。 この質問 単純な「構造体のような」オブジェクトについて。そうすれば、オブジェクトの周りを通過できるようになります。 job, 、タプルや辞書よりもさらに簡単にそのフィールドにアクセスできます。

job.jobId, job.username = jobId, username

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

これはどう:

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__ 方法!スターレのようなものです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top