jparise / python-reloader

Dependency-based Python Module Reloader
http://www.indelible.org/ink/python-reloading/
MIT License
135 stars 27 forks source link

issue with socket._GLOBAL_DEFAULT_TIMEOUT #19

Open thehesiod opened 10 years ago

thehesiod commented 10 years ago

I had a scenario where I did something like this (sorry, don't have it exactly anymore):

reloader.py:

import reloader
def droneReloader():
    import drone
    return drone.drone()

reloader.enable()
while droneReloader(): pass

drone.py:

import Utils
Utils.ftpStuff()

Utils.py:

import ftplib

def ftpStuff():
    ftplib.FTP('foo.com')

The issue I noticed is that after refreshing Utils.py, and then reloading drone.py, FTP would error out because eventually it decided that the default timeout was != socket._GLOBAL_DEFAULT_TIMEOUT and therefore tried to pass a generic object to timeout and error stating that it wasn't a float.

I think whats happening is that the object() used as the _GLOBAL_DEFAULT_TIMEOUT reference gets replaced between ftplib/socket after the module gets re-loaded so it doesn't recognize it anymore. I think socket.py shouldn't be using this mechanism as the default anyways, its dumb, it should instead have used -1 or something...however, whats the recommended solution?

jparise commented 10 years ago

It's hard to say exactly what's going on here without a way to reliably reproduce the problem.

But there's fortunately a way to work around this issue by adding it to the blacklist. That should work fine for your case because it doesn't sound like you're interested in reloading ftplib itself.