2013-12-14 27 views
6

Tembel olarak değerlendirilmiş str benzeri bir sınıfı uygulamaya çalışıyorum. str.join: Şimdi ne var biri hariç, çoğu durumda (benim amaçlar için) çalışıyorBir Python str'i proxy yapmak ve işe katılmak mümkün mü?

class LazyString(object): 

    __class__ = str 

    def __init__(self, func): 
     self._func = func 

    def __str__(self): 
     return self._func() 

gibi simething edilir

' '.join(['this', LazyString(lambda: 'works')]) 

TypeError: sequence item 1: expected string, LazyString found 

Ve bazı sonra başarısız olur Etrafında dolaşmak, arkasındaki herhangi bir sihir fonksiyonu gibi görünmüyor. join, çekirdek uygulamasında sabit kodlanmış gibi görünüyor ve yalnızca sınırlı yerleşik türdeki örnekler, aslında str olmaksızın çalışmasını sağlayabilir.

Bu yüzden burada gerçekten seçeneklerim yok mu, yoksa farkında olmadığım başka bir yol var mı?

+1

Dizeyi alt sınıflara ayırmanız ve daha sonra ihtiyacınız olan şey için ayarlamanız mümkün mü? – Ffisegydd

+0

Macera dolu hissediyorsanız, bunu asla kullanmamaya yemin edin ve CPython'u kullanıyorsunuz, [maymun yama] (https://github.com/clarete/forbiddenfruit) str.join'. – Blender

+0

Hafifçe rahatsız edici başka durumlar da vardır: 'katıl' argümanlarını dizgilere zorlamaya çalışmaz. İstediğiniz, daha az yazılan bir dildir, ama elbette onun dezavantajları vardır. –

cevap

2

join dizeleri alır, bu yüzden asar vermek:

' '.join(map(str, ['this', LazyString(lambda: 'works')])) 

Python aradığınız şeffaf tembel değerlendirme tür desteği yok. Tembel bir nesnenin değerlendirmesini zorlamak istiyorsanız, gerektiğinde otomatik olarak yapmak yerine, bunu açıkça yapmanız gerekecektir. Bazen, Python bir tembel boolean istiyorsanız, __nonzero__ gibi güvenebileceğiniz bir nesne yöntemini arayacaktır, ancak her zaman değil, ve genellikle tam birlikte çalışabilirlik elde edemezsiniz.

İlgili konular