我有一个我正在使用的文件。我想创建一个读取文件并将内容放入字典的函数。然后该字典需要通过main函数传递。这是主程序。它无法改变。我所做的一切都必须与主程序一起使用。
def main():
sunspot_dict = {}
file_str = raw_input("Open what data file: ")
keep_going = True
while keep_going:
try:
init_dictionary(file_str, sunspot_dict)
except IOError:
print "Data file error, try again"
file_str = raw_input("Open what data file: ")
continue
print "Jan, 1900-1905:", avg_sunspot(sunspot_dict, (1900,1905),(1,1))
print "Jan-June, 2000-2011:", avg_sunspot(sunspot_dict, (2000,2011), (1,6))
print "All years, Jan:", avg_sunspot(sunspot_dict, month_tuple=(1,1))
print "All months, 1900-1905:", avg_sunspot(sunspot_dict, year_tuple=(1900,1905))
try:
print "Bad Year Key example:", avg_sunspot(sunspot_dict, (100,1000), (1,1))
except KeyError:
print "Bad Key raised"
try:
print "Bad Month Index example:", avg_sunspot(sunspot_dict, (2000,2011), (1,100))
except IndexError:
print "Bad Range raised"
keep_going = False
print "Main function finished normally."
print sunspot_dict
这是我到目前为止所做的:
def init_dictionary(file_str, sunspot_dict):
line = open(file_str, "rU")
sunspot_dict = {}
for i in line:
sunspot_dict[i]
print sunspot_dict
答案 0 :(得分:1)
鉴于您在回复Raymond时给出的限制,您无法修改init_dictionary()
方法,并且要求您传递一个字典然后填充它,我建议您自己创建class dict
的子类。
class MySunspotDict(dict):
def __init__(self, file_str):
init_dictionary(file_str, self)
# ... define your other methods here
sunspot_dict = MySunspotDict(file_str)
sunspot_dict = MySunspotDict(file_str)
行转到您目前所在的位置init_dictionary(file_str, sunspot_dict)
,因此现有的file_str
会传递给MySunspotDict
构造函数(__init__()
方法),然后将其传递给init_dictionary()
。
init_dictionary()
调用与您已有的调用相同,只是它将新对象而不是空dict
传递给填充字典的函数。由于您的新类派生自dict
,即它是一个子类,因此它就像常规字典一样。所以你拥有的基本上是dict
你可以附加自己的方法。 (您也可以通过定义具有特殊名称的方法来覆盖某些标准字典行为,但在这种情况下您不需要这样做。)
请注意,在您的方法中,self
将是字典 - 您无需在__init__()
中创建字典并将其存储为类的属性(您将看到这一点)很多Python代码中的模式)。字典在__init__()
运行时已经存在。
答案 1 :(得分:1)
根据您的第二条评论和预览代码,您走在正确的轨道上。 Python中的字典通过引用传递,因此您应该只能填充提供给init_dictionary
的字典,并且可以在main()
中访问这些值。在您的情况下,您将使用行init_dictionary
在sunspot_dict = {}
中创建新词典。您不希望这样做,因为您要使用的词典已在main()
。
此时我们需要知道您正在阅读的文件的格式。基本上你需要打开文件,然后可能在将行分解为键/值对并填充sunspot_dict
时逐行读取。