2013-12-14 7 views
6

私は、レイジー評価strのようなクラスを実装しようとしています。 str.join::私が今持っていることは、1つを除いて、ほとんどの場合、(私の目的のために)正常に動作Pythonのstrをプロキシして結合することはできますか?

class LazyString(object): 

    __class__ = str 

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

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

ようsimethingさ

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

TypeError: sequence item 1: expected string, LazyString found 

そして、いくつかの後で失敗しますそこを突き刺すことは、この背後にある魔法のようなものではないようです。 joinは、コア実装の内部でハードコーディングされているように見える、と限らビルトインタイプの唯一のインスタンスは、それが実際にstrされることなく動作させることができます。

だから私はここで本当に選択肢のうちの午前、または私は認識していないよ別の方法はありますか?

+1

それは可能ですか? – Ffisegydd

+0

あなたは冒険を感じている場合は、これを使用しないように誓う、とCPythonと、あなたの可能性[モンキーパッチ](https://github.com/clarete/forbiddenfruit) 'str.join'を使用しています。 – Blender

+0

他の状況では、 'join'が引数を文字列に強制的に強制しようとしないという少し面倒です。あなたが望むのはあまり強く型付けされていない言語ですが、もちろんその欠点もあります。 –

答えて

2

joinは文字列を取り、それが文字列与える:

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

Pythonは、あなたが探している透明遅延評価の種類をサポートしていません。遅延オブジェクトの評価を強制したい場合は、必要に応じて自動的に行うよりも、明示的に行う必要があります。あなたが怠惰なブールをしたい場合は時々、Pythonはあなたが頼ることができるあなたのオブジェクト、など__nonzero__のいくつかのメソッドを呼び出しますが、常にではないが、あなたは一般的に完全な相互運用性を実現することができません。あなたは、文字列をサブクラス化して、必要なもののためにそれを調整するため

関連する問題