2010-03-08 15 views
6

Yerel olarak tanımlanmış işlevler için herhangi bir yol var mı? Örnek olarak, testi geçememek içindoctest yerel olarak tanımlanmış işlevler

def foo(): 
    """ >>> foo() 
    testfoo""" 

    def foo2(): 
    """ >>> 1/0 """ 
    print 'testfoo' 

    foo2() 

.

def foo(): 
    """ 
    >>> foo() 
    testfoo""" 

    def foo2(): 
    """ >>> 1/0 """ 
    print 'testfoo' 

    foo2() 

if __name__ == '__main__': 
    import doctest 
    doctest.testmod() 

testi sadece geçirir: örneğin, düzeltmek eğer aşağıdaki gibi - Ama yine de

cevap

1

Sadece bir boşluk sorun var ... tüm modül için foo2 küresel yapmak istemem ince.

+0

Bu bir yazım hatasıdır ve niyetimi şaşırtıyor: __NOT__ testinin geçmesini istiyorum .. foo2'deki doctest dizesi nedeniyle "ZeroDivisionError: tamsayı bölme veya sıfıra göre modulo" gibi bir şey almak istiyorum. Soru, altprogramların nasıl yapılacağıdır. –

+0

Ah, anlıyorum. (Nested) işlev nesnesinin mevcut olmadığı bir ** nested ** işlevinin docstring'i görünmez - ve kodunuzda foo2 için işlev nesnesi yalnızca dış işlev foo yürütülürken var olur. (Dış işlevin *, uygulama içi detayı olarak dahili olarak kullanmak yerine iç işlev nesnesini döndürdüğü normal kapatma fabrikası durumunda, daha fazla seçenek vardır). Temel olarak, ** bir şekilde foo2'nin tersine gizlenmiş bir dokumanın foo2 işini yapmak zorundadır, çünkü hiç kimse bunu yapamaz (foo2 ** başka biri için ** yoktur **). –

1

Teşekkürler. Şimdiden korktum ki, doktorun dışındaki kodlar arasında bir yol yoktur. Yine de, bir fonksiyonun yerlilerini ithal etmenin ve böylece iç içe geçmiş fonksiyonlara erişmenin bir hilesi olabileceğini düşündüm. Her neyse, Alex' yaklaşımını kullanarak bir çözüm Şimdi tek sorun bir

for f in locals().values(): doctest.run_docstring_examples(f,locals()) 

ancak fonksiyonları ve değişkenleri ithal ve yerleşik olmayan

gibi bir şey vardır, böylece bu yaklaşımı otomatik hale nasıl

def foo(debug=False): 
    """ 
    >>> foo() 
    testfoo 
    >>> foo(debug=True) 
    """ 

    def foo2(): 
    """ 
     >>> 1/0""" 
    print 'testfoo' 


    if debug : 
    import doctest 
    for f in [foo2]: doctest.run_docstring_examples(f,locals()) 

    foo2() 

okurdum .

İlgili konular