2017-07-09 19 views
5

Czytałem o tym chłodnym nowego typu słowniku, to transformdictpython - Wykonywanie funkcji przekształcić od parametru dict przy tworzeniu nowego transformdict

Chcę używać go w moim projekcie, poprzez inicjowanie nowego przekształcenia dict regularne dict :

tran_d = TransformDict(str.lower, {'A':1, 'B':2}) 

który powiedzie się, ale gdy uruchomię to:

tran_d.keys() 

uzyskać:

['A', 'B'] 

Jak zasugerowałbyś wykonanie funkcji transformacji na parametrze (regularnym) podczas tworzenia nowego pliku transformacji? Wystarczy być jasne, chcę następujące:

tran_d.keys() == ['a', 'b'] 
+2

Ale to nie jest po prostu punkt 'transform_dict'. Zawsze możesz jednak ręcznie go rzucić na małe litery: 'map (str.lower, tran_d.keys())'. Byłoby również pomocne (jeśli chcesz obejść), jeśli uwzględniłeś rzeczywistą implementację (lub moduł) dla 'TransformDict'. :) – MSeifert

+0

Zauważ, że ten dyktat został zasugerowany jako PEP 455, a ** został odrzucony **. – Uriel

+0

Dziękuję za uwagi. @MSeifert Widzę twój punkt, domyślam się, że muszę zrobić transformację osobiście używając transform_func.Możesz zajrzeć do kodu źródłowego pod adresem: https://github.com/fluentpython/example-code/blob/master/03-dict-set/transformdict.py – NI6

Odpowiedz

3

Już to powiedziałem w komentarzach, ale ważne jest, aby zdać sobie sprawę, że nie jest to zamierzone zadanie. Dlatego można rozszerzyć ją z realizacji niestandardowych dla keys:

class MyTransformDict(TransformDict): 
    def keys(self): 
     return map(self.transform_func, super().keys()) 

zależności od wersji Pythona prawdopodobnie trzeba użyć list() wokół map (Python 3) lub dostarczyć argumentów dla super: super(TransformDict, self) (Python 2). Ale powinno to zilustrować zasadę.

Jako że @Rawing wskazał w komentarzach, będzie więcej metod, które nie działają zgodnie z oczekiwaniami, tj. __iter__, items i prawdopodobnie także __repr__.

+0

W zależności od implementacji 'TransformDict' (nie mam widziałem jego kod źródłowy) możesz również zastąpić '__iter__', aby uzyskać takie samo zachowanie podczas iteracji nad dyktatem. –

+0

@Rawing Masz rację. Pytanie wymagało konkretnie "kluczy", więc podałem tylko rozwiązanie tego problemu. Ale dodałem notatkę o metodach, które mogą zachowywać się nieoczekiwanie. – MSeifert

+0

Link do kodu źródłowego: https://github.com/fluentpython/example-code/blob/master/03-dict-set/transformdict.py – NI6

2

Per realizacji widziałem, funkcja transformacja może zostać osiągnięty poprzez właściwość o nazwie transform_func, więc

list(map(tran_d.transform_func, tran_d.keys())) 

powinien robić.

0

Nie zawracałbym sobie głowy korzystaniem z narzędzia TransformDict. Zostało zaproponowane jako PEP 455 i zostało odrzucone . Oznacza to, że nie będzie to funkcja wbudowana, więc musisz ręcznie ją wdrożyć samodzielnie lub skorzystać z biblioteki, która to zrobi.

Wnioski delegata BDFL na temat PEP można znaleźć here. Obniżona wersja to:

  1. Jest mniej czytelna niż konwersja kluczy przed użyciem.
  2. Łamie się w dziwny sposób, czasem nawet emitując błędne błędy.
  3. Wprowadza niepotrzebną złożoność, ponieważ używanie prostych dyktatur pozwala uniknąć powyższych problemów.