Python错误:TypeError:'模块'对象不能为HeadFirst Python代码调用

Vla*_*mir 16 python module

我正在关注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