2010-10-18 8 views
8

Python sınıfları şöyle, yapıcı çalışan bir parçası olarak:Python/Sphinx belge nesnesi özniteliklerini __init__ içinde yalnızca nasıl ilan edebilirim? nesnesi, yalnızca beyan edildiği nitelikleri ile

class Foo(object): 
    def __init__(self, base): 
     self.basepath = base 

     temp = [] 
     for run in os.listdir(self.basepath): 
      if self.foo(run): 
       temp.append(run) 
     self.availableruns = tuple(sorted(temp)) 

şimdi ya help(Foo) kullanabilir veya, self.basepath ve self.availableruns nitelikleridir Sfenks içinde Foo belgelemek denerseniz gösterilmemiş. Bu, API'mızın kullanıcıları için bir sorun.

Bunları "dinamik ilan" özelliklerinin bulundu (ve tercihen docstring'd) çözümleyici tarafından, ama hayır şans şimdiye kadar olabilir emin olmak için standart bir yol aramaya çalıştım. Baska öneri? Teşekkürler.

cevap

2

Sen örnek değişkeni ile aynı adı taşıyan bir sınıf değişkeni tanımlayabiliriz. Bu sınıf değişkeni, ayarlandığında örnek değişken tarafından gölgelenecektir. Örnek: örnek değişkeni yararlı bir değişmez varsayılan değeri (örn Yok veya boş lü) varsa onun varsayılan olmalıdır eğer

class Foo(object): 
    #: Doc comment for availableruns 
    availableruns =() 

    def __init__(self, base): 
     ... 
     self.availableruns = tuple(sorted(temp)) 

Nitekim, o zaman sadece değişken ayarlayarak değil biraz bellekten tasarruf edebilirsiniz değer. Tabii ki, silmek isteyebileceğiniz bir örnek değişken hakkında konuşuyorsanız, bu yaklaşım işe yaramaz (ör. del foo.availableruns) - fakat bunun çok yaygın bir durum olmadığını görüyorum.

siz "autoattribute" set sfenks kullanarak açar ve daha sonra bu uygun şekilde belgelenmiş almalısınız. Ya da, yaptığınız şeyin içeriğine bağlı olarak, doğrudan Sphinx .. py:attribute:: yönergesini kullanabilirsiniz.

8

Bu "dinamik olarak bildirilen" özniteliklerin ayrıştırıcı tarafından bulunabildiğinden (ve tercihen doküman haline getirildiğinden) emin olmak için standart bir yol aramayı denedim, ancak şimdiye kadar hiç şans yok. Baska öneri?

Onlar hiç herhangi ayrıştırıcı tarafından "tespit" edilemez.

Python setattr sahiptir. Bütün nitelikler dizisi, kelimenin herhangi bir anlamıyla asla "saptanabilir" değildir.

Kesinlikle docstringe bunları açıklamak gerekir

.

[inspect veya başka bir şeyden topladığınız malzemeden belge dizeleri oluşturmak için meta programlama yapmak istemediğiniz sürece. Eğer setattr kullanarak başlangıç ​​olarak zaman bile, "çözüm" en kısa sürede eksik olurdu.]

class Foo(object): 
    """ 
    :ivar basepath: 
    :ivar availableruns: 
    """ 
    def __init__(self, base): 
+0

Teşekkürler. Evet, özniteliklerin genel olarak hesaplanabilir olmadığını takdir ediyorum, sadece basit/standart bir şekilde beyan edilenlerden bazılarını almak için bir keşif var mıydı? sınıf nesne denetimi yerine kaynak tarama. Ya da Sphinx/help'in onları “bulması” için bu attrs özelliklerini mülk olarak ilan etmek için kodu değiştirerek. Ama neyse, doktor yeterli olacaktır amaçlarla varlıklarını beyan için Sfenks sözdizimine o işaretçi: alkış! – andybuckley

+0

"Veya bu attrs özelliklerini özellikler olarak bildirmek için kodu değiştirerek"? "declare" bir Python kavramı değildir. Üyelerin otomatik olarak belgelenmesini sağlayacaksanız, özelliklerinizi kullanmak için özellik yöntemi işlevlerini kullanabilirsiniz. Bu, ** daha fazla iş gibi görünüyor, sadece dokümanlar içinde belgelemekten ibaret. –

+0

Ancak, belgelerin kalitesini önemli ölçüde geliştirdiğini düşündüğüm diğer yöntemlerle eşit bir temelde belgelendikleri anlamına gelir.Performansa çarpmazsa veya kodu aşılmaz hale getirmezse, bunun için biraz daha fazla çalışmaya hazırlanıyorum. İlk sorunun amacı buydu: Eminim bunu yapmanın bir yolunu bulabilirim, ama downsides'i en aza indiren (fiili) bir standart yaklaşım olup olmadığını merak ediyordum. – andybuckley