2009-05-08 6 views
7

Se inizio Python dalla riga di comando e digitare:python random.Random() fa sì che " 'modulo' oggetto non è callable" quando viene utilizzato in tag modello personalizzato

import random 
print "Random: " + str(random.random()) 

Mi stampare un numero casuale (Previsto, eccellente).

Se includo i suddetti due linee in models.py della mia applicazione Django e inizio la mia app Django con runserver ho l'uscita sulla riga di comando mostrandomi un numero casuale (Grande!)

Se prendo un tag personalizzato che funziona perfettamente bene altrimenti, ma includo

import random 
print "Random: " + str(random.random()) 

come le prime 2 righe del file .py del tag personalizzato, ottengo un errore ogni volta che provo ad aprire un modello che utilizza questo tag personalizzato:

TypeError at /help/ 
'module' object is not callable 

Si prega di tenere presente che se mi libero di queste due linee, il mio tag personalizzato si comporta come altrimenti previsto e nessun errore viene generato. Sfortunatamente, ho bisogno di un comportamento casuale all'interno del mio modello di tag.

Il problema è che se in un tag personalizzato che faccio:

import random 

su un tag modello personalizzato, importa

<module 'django.templatetags.random' from '[snip path]'> 

e non

<module 'random' from 'C:\\Program Files\\Python26\\lib\\random.pyc'> 

come normalmente importati da ogni altra parte

La libreria di template di Django ha un filtro chiamato random, e in qualche modo ha priorità sul sistema.

Qualcuno può consigliare come importare in modo esplicito il python corretto casuale?

+0

provare: 'dall'importazione casuale casuale' – jfs

risposta

14

La risposta è ... strano.

Quando ho originariamente scritto il mio tag personalizzato, l'ho chiamato random.py. Ho subito capito che questo nome potrebbe non essere buono e lo ho rinominato randomchoice.py e ho cancellato il mio file random.py. Python ha mantenuto il file compilato random.pyc e si stava caricando ogni volta che facevo import random. Ho rimosso il mio file random.pyc e il problema è andato via.

2

È passato un po 'di tempo da quando ho armeggiato con Django, ma se random.random è un "modulo", prova a random.random.random(). O forse prova solo a caso(). Semplicemente non sai che tipo di hackery continua dietro le quinte.

Modifica

Prova questa:

sys.path = [r"C:\Program Files\Python26\lib\"] + sys.path 
import random 
sys.path.pop(0) 
+0

Grazie per l'intuizione.Ho provato tutto ciò, e successivamente ho provato a stampare quale modulo esatto sta importando. Questo ha aggiunto importanti informazioni sul problema, che ho incluso nel post principale. –

5

Sì, questo tipo di errore è abbastanza semplice. Fondamentalmente non nominare nessuno dei tuoi nomi di file o qualsiasi cosa tu crei con lo stesso nome di qualsiasi probabile modulo python che stai per usare.