2010-10-26 19 views
2

Voici un exemple:Comment obtenir le numéro de ligne source à partir d'un objet générateur Python?

def g(): 
    yield str('123') 
    yield int(123) 
    yield str('123') 

o = g() 

while True: 
    v = o.next() 
    if isinstance(v, str): 
    print 'Many thanks to our generator...' 
    else: 
    # Or GOD! I don't know what to do with this type 
    raise TypeError('%s:%d Unknown yield value type %s.' % \ 
        (g.__filename__(), g.__lineno__(), type(v)) 
        ) 

Comment puis-je obtenir le nom du fichier source et le numéro de ligne de rendement exact, quand mon générateur retourne un type inconnu (int dans cet exemple)?

+3

'v = g.next()' doit être 'v = o.next()' peut-être ? – unutbu

Répondre

-1

Je ne pense pas que vous pouvez obtenir l'information que vous voulez. C'est le genre de chose capturée dans les exceptions, mais il n'y a pas eu d'exception ici.

+0

Vous êtes évidemment dans l'erreur, comme l'information est tout Thorugh simple introspection – jsbueno

+0

Je suis corrigé. –

7

Votre objet générateur "o" dans ce cas a toutes les informations que vous voulez. Vous pouvez coller votre exemple dans une console Python et inspecter avec dir à la fois la fonction "g" et le générateur "o".

Le générateur possède les attributs "gi_code" et "gi_frame" qui contiennent les informations que vous souhaitez:

>>> o.gi_code.co_filename 
'<stdin>' 
# this is the line number inside the file: 
>>> o.gi_code.co_firstlineno 
1 
# and this is the current line number inside the function: 
>>> o.gi_frame.f_lineno 
3 
+0

o.gi_frame.f_lineno exactement, ce dont j'ai besoin. Merci. –