Pour examiner la façon dont fonctionne le module urllib, j'ai truffé son code d'instructions
print 'passage 1'
print 'passage 2'
print 'passage 3'
print 'passage 4'
print 'passage 5'
print 'passage 6'
etc

J'ai ainsi observé qu'avant d'exécuter quelque instruction que ce soit, la progression dans urllib passe par toutes les instructions détectrices print 'passage x' situées en non indentation.
La dernière instruction qui soit exécutée est print 'passage 19', qui est située avant les 3 dernières de mon urllib modifié:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
print 'passage 18'
def main():
    import getopt, sys
    try:
        opts, args = getopt.getopt(sys.argv[1:], "th")
    except getopt.error, msg:
        print msg
        print "Use -h for help"
        return
    t = 0
    for o, a in opts:
        if o == '-t':
            t = t + 1
        if o == '-h':
            print "Usage: python urllib.py [-t] [url ...]"
            print "-t runs self-test;",
            print "otherwise, contents of urls are printed"
            return
    if t:
        if t > 1:
            test1()
        test(args)
    else:
        if not args:
            print "Use -h for help"
        for url in args:
            print urlopen(url).read(),
 
print '_name_  =  ',__name__
print 'passage 19'
# Run test program when run as a script
if __name__ == '__main__':
    print 'passage 20'
    main()



Puis il y a exécution de l'instruction print "J'entre dans urlopen"

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
print 'passage 3'
_urlopener = None
print type(_urlopener)#eee
def urlopen(url, data=None, proxies=None):
    print "J'entre dans urlopen"
    """urlopen(url [, data]) -> open file-like object"""
    global _urlopener
    if proxies is not None:
        opener = FancyURLopener(proxies=proxies)
    elif not _urlopener: # si _urlopener = None alors not _urlopener vaut True
        print 'ICI je passe dans elif not _urlopener'#eee
        opener = FancyURLopener()
        _urlopener = opener
        print type(opener)
        print type(_urlopener)#eee
    else:
        opener = _urlopener
    if data is None:
        print 'LA je passe par if data is none'
        return opener.open(url)
    else:
        return opener.open(url, data)
print 'passage 4'

Je ne comprends pas comment le déroulement du programme peut appeler la fonction urlopen() après être passé par l'instruction print 'passage 19',
puisqu'aprés il n'y a que 3 lignes avec une condition qui n'est même pas vérifiée ( print '_name_ = ',__name__ indique que __name__ vaut 'urllib').