Pour faire suite à ce qui précède, je dirai que AlexMartelli's y Catskul's Il y a des cas très simples, mais désagréables, qui semblent confondre l'efficacité et l'efficience de l'aide. reload
du moins dans Python 2.
Supposons que j'aie l'arbre source suivant :
- foo
- __init__.py
- bar.py
avec le contenu suivant :
init.py :
from bar import Bar, Quux
bar.py :
print "Loading bar"
class Bar(object):
@property
def x(self):
return 42
class Quux(Bar):
object_count = 0
def __init__(self):
self.count = self.object_count
self.__class__.object_count += 1
@property
def x(self):
return super(Quux,self).x + 1
def __repr__(self):
return 'Quux[%d, x=%d]' % (self.count, self.x)
Cela fonctionne très bien sans utiliser reload
:
>>> from foo import Quux
Loading bar
>>> Quux()
Quux[0, x=43]
>>> Quux()
Quux[1, x=43]
>>> Quux()
Quux[2, x=43]
Mais si l'on essaie de recharger, cela n'a aucun effet ou corrompt les choses :
>>> import foo
Loading bar
>>> from foo import Quux
>>> Quux()
Quux[0, x=43]
>>> Quux()
Quux[1, x=43]
>>> reload(foo)
<module 'foo' from 'foo\__init__.pyc'>
>>> Quux()
Quux[2, x=43]
>>> from foo import Quux
>>> Quux()
Quux[3, x=43]
>>> reload(foo.bar)
Loading bar
<module 'foo.bar' from 'foo\bar.pyc'>
>>> Quux()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "foo\bar.py", line 17, in __repr__
return 'Quux[%d, x=%d]' % (self.count, self.x)
File "foo\bar.py", line 15, in x
return super(Quux,self).x + 1
TypeError: super(type, obj): obj must be an instance or subtype of type
>>> Quux().count
5
>>> Quux().count
6
>>> Quux = foo.bar.Quux
>>> Quux()
Quux[0, x=43]
>>> foo.Quux()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "foo\bar.py", line 17, in __repr__
return 'Quux[%d, x=%d]' % (self.count, self.x)
File "foo\bar.py", line 15, in x
return super(Quux,self).x + 1
TypeError: super(type, obj): obj must be an instance or subtype of type
>>> foo.Quux().count
8
La seule façon pour moi de m'assurer que le bar
a été rechargé était de reload(foo.bar)
; le seul moyen d'accéder à l'information rechargée sur les Quux
est d'aller la chercher dans le sous-module rechargé ; mais la classe foo
Le module lui-même a conservé la version originale de la Quux
vraisemblablement parce qu'il utilise l'objet de classe from bar import Bar, Quux
(plutôt que import bar
suivi de Quux = bar.Quux
) ; en outre, le Quux
s'est désynchronisée, ce qui est tout simplement bizarre.