2017-02-13 22 views
5

Tembel bir özelliği uygulamaya çalışıyorum. De ki, bir nesne object._x = None tarafından başlatmak ve sonra başlatıcı özellik aranır sadece ilk defa çağrılması için bir şeylerpython: ifadesi ifade içinde olabilir mi?

@property 
def x(self): 
    return self._x or (init_x_value(); x) 

yazmak istiyorum.

Scala'da, bir ifade ifadeleri içerebilir. Python'da benzer bir şey mümkündür. Değilse, uygulamak için alternatif bir yolu var mı yoksa if-else ile mi bağlı kalmalıyım? init_x_valuedöner None, sadece

+0

'? –

+1

Bildiğim kadarıyla bu yapılamıyor, bu da 'lambda'nın Python'da çok sınırlı olmasının nedenlerinden biri. – melpomene

+0

@WillemVanOnsem: '_x' değerini hesaplayabilir ve nesneyi –

cevap

6

kullanabiliyorsanız:

return self._x or init_x_value() or self._x 

Not Ancak @3Doubloons kendi yorumunu yazdığı gibi, eğer self._x şey yanlış imsi gibi None, [] (boş olduğunu list), () boş bir tuple veya __bool__ yöntemini geçersiz kılan bir sınıf, hesaplama hızına init yöntemiyle geçebilir. durumda

hesaplanan x değerin kendisi, hatta yazabilir init_x_valuedöner hoşuna: Bu

return self._x or init_x_value() 

Python or oldukça özel, çünkü: x or y işleri gibi:

if bool(x): 
    return x 
else: 
    return y 

ve x ve y tembel olarak üretilir. İlk durumda bool(None)False olduğundan, self._x kontrol edecektir. self._x, None ise, zincirinin tarafından kabul edilmeyen None ifadesini döndüren bir yöntem döndürmediğinden, bu yöntem numaralı telefonu arayarak devam edecektir, bu nedenle son olarak ayarlanan son self._x öğesinin sonuna gider.

+0

Güzel, çift 'veya' kullanmak için bana gelmedi. Ancak, bir deyim ve bir işlev çağrısı istemiyorsanız, hiçbir şekilde yapılabilir değil mi? –

+0

@blue_note: bildiğim kadarıyla, bir ödevin sonucu olmadığı için (hiçbir şey döndürmez). –

+0

Bu yaklaşıma dikkat etmelisiniz. Eğer self._x' falsey ise, her seferinde init_x_values ​​değeri çağrılır. – 3Doubloons

5

Başlığı soruyu yanıtlamak için: hayır, Python'da bir ifade bir deyim içeremez. dönem.

sizin getter yazmak için uygun pythonic yoludur:

@property 
def x(self): 
    # assume _x defaults to None 
    if self._x is None: 
     # here you can have has many statements as 
     # you like ;) 
     self._x = init_x_value() 
    return self._x 

'veya' ya satır içi tablolar ya da her türlü üçlü kadar akıllı görünmeyebilir ama o kadar basit, kolay, açık ve bunun yanı okunabilir olabilir.

1

Bir işlevinde ifadeleri gizleyebilir: `None` hakkını verir init_x_value`

@property 
def x(self): 
    def initialize_and_return_x(): 
     init_x_value() 
     return self._x 
    return self._x or initialize_and_return_x() 
İlgili konular