0

私はPythonプログラミングが初めてで、(おそらく)特定の質問があります。Pythonでこれができるかどうかはわかりませんが、基本的には、ブロック全体を表す変数を割り当てたいと考えています。

たとえば、私はこれを持っています:

item.history[len(item.history)] = {'user': item.user,
                        'email': item.email, 'phone': item.phone,
                        'status': item.status, 'usage': item.usage,
                        'checkouttime': item.checkouttime,
                        'checkintime': item.checkintime,
                        'timeout': item.checkintime - item.checkouttime}

これは 1 つの場所に多くのものがあります。私のプログラムでは、このコードの同じチャンク (以下に ShortHis として示されています) が約 15 回繰り返され、履歴キーが変更され、checkintime と checkouttime の代わりに異なる変数が使用されることがあります。私がこれをしたかどうかを考えました:

ShortHis = ('user': item.user,
    'email': item.email, 'phone': item.phone,
    'status': item.status, 'usage': item.usage,
    'checkouttime': item.checkouttime,
    'checkintime': item.checkintime,)

次にこれ:

item.history[len(item.history)] = {ShortHis
                        'timeout': item.checkintime - item.checkouttime}

機能し、スペースを節約でき、キーと checkintime および checkouttime 変数を編集できますが、編集できません。なぜこれがうまくいかず、どうすれば欲しいものを作ることができますか? (そんなものがあれば)

Pythonプログラミングは初めてだと言ったので、これらが何と呼ばれているかについて特定の用語を省略していたら申し訳ありません。

より明確にする:内容や長さに関係なく、何かの塊、あらゆるものを、以前と同じようにそのものを表す変数(または何か)に割り当てたいので、その変数を何かの真ん中に置くことができます元のコードがそこにあるかのように実行されます。

4

5 に答える 5

1

...もののブロック全体を表す変数。

次に、オプションのプロパティを持つクラスを使用する必要があります。

class Item(object):
  def __init__(self, user, ...):
    self.user = user
     ...

someitem = Item(me, ...)
print someitem.timeout
于 2012-07-17T08:11:05.050 に答える
1

ここで関数を使用するのはおそらく良い考えです

def get_short_history(item):
    return {
       'user': item.user,
       'email': item.email,
       'phone': item.phone,
       'status': item.status,
       'usage': item.usage,
       'checkouttime': item.checkouttime,
       'checkintime': item.checkintime
    }

その後、このチャンクを再利用できます

items.history.append(get_short_history(item).update({checkintime: 'overwrite'}))
于 2012-07-17T07:13:31.840 に答える
0

おそらくそうですか?

class Item(object):

    def __init__(self, user='', email='', phone=''):
        self.user = user
        self.email = email
        self.phone = phone
        self.time = ''
        self.history = []

    def add_short(self):
        self.time = time.asctime()
        self.history.append( {'user':self.user, 'time': self.time} )

    def add_long(self):
        self.time = time.asctime()
        self.history.append( {'user':self.user, 'email': self.email, 
            'phone': self.phone, 'time': self.time } )

使用例:

import time
from pprint import pprint as pp
item = Item('dudely', 'dudely@doright.com', '111-222-3333')
item.add_short()
time.sleep(1)
item.add_short()
time.sleep(1)
item.add_long()
time.sleep(1)
item.add_short()
time.sleep(1)
item.add_long()
pp(item.history)

出力例:

[{'time': 'Tue Jul 17 04:26:05 2012', 'user': 'dudely'},
 {'time': 'Tue Jul 17 04:26:06 2012', 'user': 'dudely'},
 {'email': 'dudely@doright.com',
  'phone': '111-222-3333',
  'time': 'Tue Jul 17 04:26:07 2012',
  'user': 'dudely'},
 {'time': 'Tue Jul 17 04:26:08 2012', 'user': 'dudely'},
 {'email': 'dudely@doright.com',
  'phone': '111-222-3333',
  'time': 'Tue Jul 17 04:26:09 2012',
  'user': 'dudely'}]
于 2012-07-17T08:31:11.040 に答える
0

「update」メソッドを使用して、辞書の内容を変更できます。以下の例を参照してください。

dict1 = {'a':1, 'b':2}
dict1.update({'c':3})

したがって、一時変数に値を格納する代わりに、元の辞書を作成し、modify メソッドを使用して更新します。

于 2012-07-17T07:14:18.387 に答える
0

問題のコードが機能するかどうかに関係なく、Python の割り当てはオブジェクトへの参照の割り当てを意味します。このように、割り当てられたオブジェクトは実際にはもう 1 つの参照を介して共有されます。つまり、Python の割り当ては共有を意味します。

共有チャンクが一定である場合、メモリ空間の使用の最適化と見なすことができます。共有チャンクが一定でない場合は、元の意図に依存します。

Python 変数はすべて、ターゲット オブジェクトへの参照です。

さて、あなたがよく理解しているなら、あなたは履歴リストに新しいレコードを追加したいと考えています。は'timeout'特別で、ShortHis共有するものです。この場合、共有チャンク (たとえば'ref') に新しいキーを使用し、そのShortHisチャンクをキーの値として使用する必要があります。このようなもの:

record = { 'timeout': item.checkintime - item.checkouttime,
           'ref': ShortHis }

item.history.append(record)
于 2012-07-17T07:14:24.360 に答える