2015-12-20 2 views
0

J'essaie d'utiliser un dictionnaire pour m'empêcher de stocker des doublons et cela fonctionne bien mais quand j'essaie de sortir les objets du dictionnaire et d'appeler des fonctions sur eux l'interprète me dit:Objets hors de OrderedDict en Python à modifier

Traceback (most recent call last): 
    File "C:/Users/ejsol/Desktop/NflData/playerDataCollector.py", line 24, in   
<module> 
print unique_qb[0].stats(2015, week=13) 
TypeError: 'OrderedDict' object is not callable 

J'ai essayé de faire des copies en profondeur des éléments dans le dictionnaire et en utilisant ceux de faire une liste mais je reçois toujours la même question. J'ai lu quelques informations sur la façon dont python lie les noms aux objets, c'est pourquoi j'ai pensé que copier les objets hors du dictionnaire fonctionnerait mais il semble ne pas fonctionner.

Heres mon code:

import nflgame 
import copy 

players = dict() 
qbs = dict() 
#get a list of all games in 2014 
games = nflgame.games(2014) 
#make a list of the players in each game 
for g in games: 
    _p = g.players 
    for p in _p: 
     if p.playerid not in players: 
      players[p.playerid] = p 
#find all the qbs in the players 
for p in players: 
    if players[p].guess_position == 'QB' and p not in qbs: 
     qbs[p] = players[p] 
    #copy qbs to a list that I can manipulate 
    unique_qb = [] 
    for v in qbs: 
     c = copy.deepcopy(qbs[v]) 
     unique_qb.append(c) 
    print unique_qb[0].name 
    print unique_qb[0].stats(2015, week=13)#this line produces the error 

Comment puis-je obtenir des objets d'un dictionnaire à utiliser sans la contrainte d'être dans un dictionnaire ordonné et étant donc « pas appelable »

modifier:

la fonction

unique_qb[0].stats(2015, week=13) 

est un appel à l'objet tha t est stocké dans cette entrée du dictionnaire et voici son stub de l'api nflgame que j'essaie d'utiliser.

def stats(self, year, week=None): 
    games = nflgame.games(year, week) 
    players = list(nflgame.combine(games).filter(playerid=self.playerid)) 
    if len(players) == 0: 
     return GamePlayerStats(self.player_id, self.gsis_name, 
           None, self.team) 
    return players[0] 
+0

Il n'y a aucune utilisation de 'OrderedDict' ici. Ce qui me rend un peu méfiant que vous n'ayez aucune idée de ce que vous faites, ou que votre exemple omette des morceaux très importants. – ShadowRanger

+0

Je n'ai aucune idée de ce que je fais Je ne connais pas du tout Python. Et je ne pensais pas que j'utilisais OrderedDict non plus, mais le message d'erreur me l'a dit. – esoler

+0

Vous êtes indentation dans le code posté est faux. Je reçois 'IndexError: liste index hors de la plage' sur la ligne' print unique_qb [0] .name', mais je peux reproduire votre erreur en désindiquant '#copy qbs ...' et tout ce qui suit. –

Répondre

1

Un dictionnaire est accessible avec [] pas (). Ce dernier est pour les appels de fonction.

L'utilisation d'un débogueur, .stats est une propriété qui retourne un OrderedDict:

@property 
def stats(self): 
    """ 
    Returns a dict of all stats for the player. 
    """ 
    return self._stats 

[Dbg]>>> unique_qb[0].stats 
OrderedDict([(u'passing_att', 33), (u'passing_twoptm', 0), (u'passing_twopta', 0), (u'passing_yds', 250), (u'passing_cmp', 22), (u'passing_ints', 0), (u'passing_tds', 2), (u'rushing_lngtd', 0), (u'rushing_tds', 0), (u'rushing_twopta', 0), (u'rushing_lng', -1), (u'rushing_yds', -1), (u'rushing_att', 1), (u'rushing_twoptm', 0)]) 

Comme il est un dictionnaire, vous avez besoin []. Par exemple:

[Dbg]>>> unique_qb[0].stats['passing_att'] 
33 

Puisque vous avez décrit une fonction différente, vous n'appelez pas la fonction que vous pensez être.

+0

J'ai accédé au dictionnaire avec []? – esoler

+0

@esoler, Comme je l'ai dit, il n'y a pas assez d'informations, mais ce message d'erreur est d'appeler un dictionnaire '()' plutôt que d'utiliser '[]'. Publiez la trace complète du message d'erreur. –

+0

@esoler, j'ai installé l'API et mis à jour ma réponse. –