2013-12-14 15 views
6

Sto provando ad implementare una classe str-like valutata pigra. Quello che ho ora è simething comeÈ possibile eseguire il proxy di uno str di Python e far funzionare il join?

class LazyString(object): 

    __class__ = str 

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

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

che funziona bene (per i miei scopi) nella maggior parte dei casi, tranne uno: str.join:

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

fallisce con

TypeError: sequence item 1: expected string, LazyString found 

E dopo un po ' curiosando non sembra esserci alcuna funzione magica disponibile dietro questo. join sembra essere codificato all'interno dell'implementazione principale e solo le istanze di tipo limitato incorporato possono farlo funzionare senza effettivamente essere uno str.

Quindi sono davvero fuori dalle opzioni qui, o c'è un altro modo di cui non sono a conoscenza?

+1

È possibile per voi creare una sottoclasse di stringa e quindi regolarla per ciò che è necessario? – Ffisegydd

+0

Se ti senti avventuroso, giura di non usare mai questo, e stai usando CPython, potresti [patch-scimmia] (https://github.com/clarete/forbiddenfruit) 'str.join'. – Blender

+0

Ci sono altre situazioni in cui è leggermente fastidioso che 'join' non tenti di forzare i suoi argomenti alle stringhe. Quello che vuoi è un linguaggio meno fortemente tipizzato, ma ovviamente ha anche i suoi svantaggi. –

risposta

2

join prende le stringhe, in modo da dare stringhe:

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

Python non ha il supporto per il tipo di valutazione pigra trasparente che stai cercando. Se si desidera forzare la valutazione di un oggetto pigro, è necessario farlo in modo esplicito, anziché eseguirlo automaticamente quando necessario. A volte, Python chiamerà un metodo del tuo oggetto su cui puoi fare affidamento, come ad esempio __nonzero__ se vuoi un booleano pigro, ma non sempre, e generalmente non sarai in grado di raggiungere la piena interoperabilità.

Problemi correlati