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
,这将允许您直接写入键。
所以我正在编写一个脚本来跟踪我的通信。 它获取给我发电子邮件的人的姓名,在搁置的 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
,这将允许您直接写入键。