我正在关注HeadFirst Python书中的教程.在第7章中,我在尝试运行下一个代码时收到错误消息:
运动员班:
class AthleteList(list):
def __init__(self, a_name, a_dob=None, a_times=[]):
list.__init__([])
self.name = a_name
self.dob = a_dob
self.extend(a_times)
def top3(self):
return(sorted(set([sanitize(t) for t in self]))[0:3])
def get_coach_data(filename):
try:
with open(filename) as f:
data = f.readline()
templ = data.strip().split(',')
return(AthleteList(templ.pop(0), templ.pop(0), templ))
except IOError as ioerr:
print('File error: ' + str(ioerr))
return(None)
def sanitize(time_string):
if '-' in time_string:
splitter = '-'
elif ':' in time_string:
splitter = ':'
else:
return(time_string)
(mins, secs) = time_string.split(splitter)
return(mins + '.' + secs)
Run Code Online (Sandbox Code Playgroud)
在下一个模块中,我做了一些测试:
import pickle
import AthleteList
def get_coach_data(filename):
try:
with open(filename) as f:
data = f.readline()
templ = data.strip().split(',')
return(AthleteList(templ.pop(0), templ.pop(0), templ))
except IOError as ioerr:
print('File error (get_coach_data): ' + str(ioerr))
return(None)
def put_to_store(files_list):
all_athletes = {}
for each_file in files_list:
ath = get_coach_data(each_file)
all_athletes[ath.name] = ath
try:
with open('athletes.pickle', 'wb') as athf:
pickle.dump(all_athletes, athf)
except IOError as ioerr:
print('File error (put_and_store): ' + str(ioerr))
return(all_athletes)
def get_from_store():
all_athletes = {}
try:
with open('athletes.pickle', 'rb') as athf:
all_athletes = pickle.load(athf)
except IOError as ioerr:
print('File error (get_from_store): ' + str(ioerr))
return(all_athletes)
print (dir())
the_files = ['sarah.txt','james.txt','mikey.txt','julie.txt']
data = put_to_store(the_files)
data
Run Code Online (Sandbox Code Playgroud)
这是Julie.txt文件的内容:
Julie Jones,2002-8-17,2.59,2.11,2:11,2:23,3-10,2-23,3:10,3.21,3-21,3.01,3.02,2:59
Run Code Online (Sandbox Code Playgroud)
它与其他文件几乎相同
我应该得到类似这样的输出:
{'James Lee': ['2-34', '3:21', '2.34', '2.45', '3.01', '2:01', '2:01', '3:10', '2-22', '2-
01', '2.01', '2:16'], 'Sarah Sweeney': ['2:58', '2.58', '2:39', '2-25', '2-55', '2:54', '2.18',
'2:55', '2:55', '2:22', '2-21', '2.22'], 'Julie Jones': ['2.59', '2.11', '2:11', '2:23', '3-
10', '2-23', '3:10', '3.21', '3-21', '3.01', '3.02', '2:59'], 'Mikey McManus': ['2:22', '3.01',
'3:01', '3.02', '3:02', '3.02', '3:22', '2.49', '2:38', '2:40', '2.22', '2-31']}
Run Code Online (Sandbox Code Playgroud)
但我收到此错误消息:
['AthleteList', '__builtins__', '__cached__', '__doc__', '__file__', '__name__', '__package__', 'get_coach_data', 'get_from_store', 'pickle', 'put_to_store']
Traceback (most recent call last):
File "C:\Python\workspace\HeadFirst\src\prueba.py", line 41, in <module>
data = put_to_store(the_files)
File "C:\Python\workspace\HeadFirst\src\prueba.py", line 19, in put_to_store
ath = get_coach_data(each_file)
File "C:\Python\workspace\HeadFirst\src\prueba.py", line 11, in get_coach_data
return(AthleteList(templ.pop(0), templ.pop(0), templ))
TypeError: 'module' object is not callable
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
Sve*_*ach 56
您的模块和您的班级AthleteList具有相同的名称.这条线
import AthleteList
Run Code Online (Sandbox Code Playgroud)
导入模块并AthleteList在当前作用域中创建指向模块对象的名称.如果要访问实际的类,请使用
AthleteList.AthleteList
Run Code Online (Sandbox Code Playgroud)
特别是在线上
return(AthleteList(templ.pop(0), templ.pop(0), templ))
Run Code Online (Sandbox Code Playgroud)
您实际上是访问模块对象而不是类.尝试
return(AthleteList.AthleteList(templ.pop(0), templ.pop(0), templ))
Run Code Online (Sandbox Code Playgroud)
Aga*_*eli 11
您的模块和类AthleteList具有相同的名称.更改:
import AthleteList
Run Code Online (Sandbox Code Playgroud)
至:
from AthleteList import AthleteList
Run Code Online (Sandbox Code Playgroud)
现在,这意味着您要导入模块对象,并且无法访问您拥有的任何模块方法 AthleteList
| 归档时间: |
|
| 查看次数: |
84996 次 |
| 最近记录: |