2013-12-14 8 views
6

Próbuję zaimplementować leniwy-oceniany klasy podobne do str-like. Co mam teraz jest simething jakCzy możliwe jest proxy serwera Python i łączenie się?

class LazyString(object): 

    __class__ = str 

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

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

która działa w porządku (do moich celów), w większości przypadków, z wyjątkiem jednego: str.join:

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

nie z

TypeError: sequence item 1: expected string, LazyString found 

i po pewnym szturchanie tam nie wydaje się być żadnymi magicznymi funkcjami dostępnymi za tym. join wydaje się być zakodowany wewnątrz podstawowej implementacji, a tylko instancje o ograniczonym wbudowanym typie mogą sprawić, że będzie działał bez bycia numerem str.

Więc nie mam tu żadnych opcji, czy jest inny sposób, o którym nie wiem?

+1

Czy możliwe jest podciągnięcie łańcucha podklas, a następnie dostosowanie go do tego, czego potrzebujesz? – Ffisegydd

+0

Jeśli czujesz się żądny przygód, przysięgnij, że nigdy tego nie używasz i używasz CPython, możesz [małpa-łatka] (https://github.com/clarete/forbiddenfruit) 'str.join'. – Blender

+0

Istnieją inne sytuacje, w których jest nieco irytujące, że 'join' nie próbuje przymuszać swoich argumentów do łańcuchów. To, czego chcesz, to język, który jest słabiej napisany, ale ma też swoje wady. –

Odpowiedz

2

join trwa ciągi, więc daje to ciągi:

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

Python nie posiada wsparcia dla tego rodzaju przejrzystej oceny leniwy, którego szukasz. Jeśli chcesz wymusić ocenę leniwego obiektu, będziesz musiał to zrobić jawnie, zamiast wykonywać go automatycznie w razie potrzeby. Czasami Python wywoła pewną metodę twojego obiektu, na której możesz polegać, taką jak __nonzero__, jeśli chcesz leniwego boolowskiego, ale nie zawsze, i generalnie nie będziesz w stanie osiągnąć pełnej interoperacyjności.

Powiązane problemy