Python:附加到存储在搁置字典中的实例所拥有的列表

Python: Append to list owned by an instance stored in shelved dictionary

所以我正在编写一个脚本来跟踪我的通信。 它获取给我发电子邮件的人的姓名,在搁置的 Friend 实例字典中查找其关联的 'Friend object'(或为自己创建一个新实例并将其存储在字典中),然后将当前时间附加到该实例的列表中的时间戳。

因此,例如,如果脚本以 'John Citizen' 作为输入运行,它会在字典中找到键 'John Citizen',获取与该键关联的实例,转到该实例的列表,然后在该列表中附加一个时间戳。

这一切都按照我的意愿工作,除了追加。

这是好友对象:

class Friend():
    def __init__(self, name):
        self.name = name
        self.timestamps = []

    def add_timestamp(self, timestamp):
        self.timestamps.append(timestamp)   

这是将输入处理为名称字符串的全局函数。 (输入来自 AppleScript,并且始终采用这种格式:

Input: "First [Middles] Last <emailaddress@email.com>"



def process_arguments():

    parser = argparse.ArgumentParser()
    parser.add_argument("sender", help="The output from AppleScript")
    args = parser.parse_args()
    full_name = args.sender

    ## gets just the name
    words = full_name.split(' ')
    words.pop()
    full_name = ' '.join(words)

    ## takes away all the non alpha characters, newlines etc.
    alpha_characters = []
    for character in full_name:
        if character.isalpha() or character == " ":
            alpha_characters.append(character)
    full_name = ''.join(alpha_characters)   
    return full_name

然后是处理 full_name 字符串的脚本。

  ## Get the timestamp and name
now = datetime.datetime.now()
full_name = process_arguments()

## open the shelf to store and access all the friend information

shelf = shelve.open('/Users/Perrin/Library/Scripts/friend_shelf.db')

if full_name in shelf:
    shelf[full_name].add_timestamp(now)
    shelf.close
else:
    shelf[full_name] = Friend(full_name)
    shelf.close

我已尝试对其进行调试,full_name 在 shelf 中的计算结果为 True,但问题仍然存在。

我似乎无法填充 self.timestamps 列表。如果有任何帮助,我将不胜感激!

@paulrooney 回答了这个问题。

架子中的对象需要从架子上移除、分配名称、变异(以添加时间戳),然后放回架子中。此代码工作正常。

shelf = shelve.open('/Users/Perrin/Library/Scripts/friend_shelf.db')

if full_name in shelf:
    this_friend = shelf[full_name]
    this_friend.add_timestamp(now)
    shelf[full_name] = this_friend
    print shelf[full_name].timestamps
    shelf.close

else:
    shelf[full_name] = Friend(full_name)
    this_friend = shelf[full_name]
    this_friend.add_timestamp(now)
    shelf[full_name] = this_friend
    shelf.close 

您需要提取、改变对象并将其存储回架子以持久保存它。

例如

# extract
this_friend = shelf[full_name]
# mutate
this_friend.add_timestamp(now)
# re-add
shelf[full_name] = this_friend
shelf.close()

您可以在 python docs 中看到这方面的示例。

另一个选项是将 writeback 参数作为 True 传递给 shelve.open,这将允许您直接写入键。