2017-11-02 62 views
11

W Pythonie 3.6, można użyć f-strings lubię:Czy możesz przeciążyć "operator" w łańcuchu znaków Python 3.6?

>>> date = datetime.date(1991, 10, 12) 
>>> f'{date} was on a {date:%A}' 
'1991-10-12 was on a Saturday' 

chcę przeciążać metody przyjmujący powyższy '%A'. Czy można to zrobić?

Na przykład, jeśli chciałem napisać niemego owijkę wokół datetime, mogę oczekiwać tego przeciążenia, aby wyglądać tak:

class MyDatetime: 
    def __init__(self, my_datetime, some_other_value): 
     self.dt = my_datetime 
     self.some_other_value = some_other_value 

    def __fstr__(self, format_str): 
     return (
      self.dt.strftime(format_str) + 
      'some other string' + 
      str(self.some_other_value 
     ) 
+0

[Tutaj jest jeden przygotowany wcześniej] (https://gist.github.com/wimglenn/3186645d0474550160d3210bf488f8f8). – wim

+1

dla pewnej większej elastyczności, możesz zastąpić metody udostępnione w klasie "string.Formatter" (https://docs.python.org/3.4/library/string.html#string.Formatter) - takie jak ' get_field', 'get_value',' check_unused_args', 'format_field' i' convert_field' - aby uzyskać bardziej szczegółową kontrolę nad zachowaniem funkcji 'format'. –

Odpowiedz

12

Tak, ale za pomocą __format__, nie __fstr__.


f -strings nie były remonty poprzednich metod do strun wielkoformatowych. Zamiast tego opiera się na już istniejących protokołach.

Od PEP 0498 które je wprowadziły, w Code equivalence:

Dokładny kod używany do wdrożenia F-ciągów nie jest określona. Jednak jest zagwarantowane, że każda wartość osadzona, która jest konwertowana na ciąg, będzie korzystać z tej metody o wartości __format__. Jest to ten sam mechanizm, który używa str.format() do konwersji wartości na ciągi.

a potem znowu w Format Specifiers:

Po wyrażenia w formacie specyfikatorem są oceniane (jeśli to konieczne), format Specyfikatory nie są interpretowane przez oceniającego f-strun. Podobnie jak w str.format(), są one przekazywane jedynie do metody formatowania obiektu.

Tak więc nie ma dla nich specjalnej metody nowa. Musisz zdefiniować metodę __format__, która pobiera specyfikację i zwraca odpowiednio sformatowany ciąg znaków.

Jak docs na __format__ opisać również:

wywoływana przez wbudowaną funkcję format(), a co za tym idzie, ocena sformatowanych napisowych i metoda str.format(), w celu wytworzenia „sformatowanej” string reprezentacja obiektu.

+0

Szczegóły - https://docs.python.org/3/reference/datamodel.html#object.__format__ –