2009-11-24 15 views
10

Çok sayıda kalıcı nesneyim var ve bunların hepsi doğru bir şekilde doldurulmuş __doc__ dizgisine sahipler, ancak bunlar üzerinde çalışan yardımlar, __doc__ tabanlı yardım yerine kendi sınıfları için yardım üretiyor.Python'un pydoc yardım işlevi nerede çalışır?

Onlarla ilgili çalışan yardımların, aslında __call__'u uygulayan bir sınıfın örnekleri yerine gerçek işlevlerse elde ettiğim gibi görünen özelleştirilmiş bir yardım oluşturması için değiştirmek istiyorum. daha bu çıktısını gibi

class myCallable: 
    def __init__(self, doc): 
     self.__doc__ = doc 

    def __call__(self): 
     # do some stuff 
     pass 

myFunc = myCallable("some doco text") 
help(myFunc) 

bak:

def myFunc(): 
    "some doco text" 
    # do some stuff 
    pass 

help(myFunc) 
+2

Benim tahminim olmasıdır Buradaki problem, sınıf tabanlı myFunc'in tip örneğine sahipken, diğerinin tip işlevi olmasıdır. Bunun bir yolu olup olmadığından emin değilim. (baskı türünü (myFunc) her birini görmek için deneyin) – Suppressingfire

+0

türler hakkında doğru, pydoc içinde kullanılan bilgi nedir? –

cevap

5

help işlevi (pydoc modülünde uygulanır) örnek başına doküman dizgilerini bulmak için hazır değildir. Açık bir yardım sunmanın bir yolu olup olmadığını görmek için modülün içinden hızlı bir şekilde baktım, ama öyle görünmüyor. Ne tür bir şey olduğunu belirlemek için inspect modülünü kullanır ve myFunc'iniz bir işlev gibi görünmüyor, örneğe benziyor. Yani pydoc, örnek sınıfın yerine yardımcı olur.

__doc__ ürününe benzer bir özellik varsa __help__ özniteliği ekleyebilirsiniz, ancak bunun için destek yok.

bunu önermek için tereddüt, ama en iyi bahis yeni help işlevi tanımlamak için olabilir:

old_help = help 
def help(thing): 
    if hasattr(thing, '__help__'): 
     print thing.__help__ 
    else: 
     old_help(thing) 

ve sonra örnekleri üzerinde __help__ niteliğini koydu:

class myCallable: 
    def __init__(self, doc): 
     self.__doc__ = doc 
     self.__help__ = doc 
+0

Bu yaklaşımı düşünmemiştim, bu ilginç bir öneri. Yardımı önemsediğim özel programın zaten bir özel konsol ve tamamlayıcısı var, bu yüzden özel yardım şaşırtıcı değil ve özel konsol kodunun bir parçası olarak yapılabilir. –

2

Ben ne soru hakkında çok net değilim

kodunda, bu çıktısını yapmak istiyorum tam olarak. Benim anlayışım, bir sınıfın ve içinde tanımlanmış bir işlevin olması ve Python'un bu işlevin yardım metnini nereden aldığını bilmek istersiniz.

Python, bu sınıfta/yöntemde sağlanan belge dizelerinden yardım metnini alır.

o sınıfta bir sınıf "A" ve bir yöntem "f" var ve işlev "f" in Docstringler varsa, o zaman aşağıdaki terminali dökümü sorunuzu temizlemek yardımcı olacaktır:

>>> class A: 
     def __init__(self): 
      self.c = 0 # some class variable 
     def f(self, x): 
      """this is the documentation/help text for the function "f" """ 
      return x+1 

>>> help(A.f) 
Help on method f in module __main__: 

f(self, x) unbound __main__.A method 
this is the documentation/help text for the function "f" 

>>> A.f.__doc__ 
'this is the documentation/help text for the function "f" ' 

Umarım bu yardımcı olur