Problem

Piszę parser plików do programu Pliki wejściowe, które mogą być nieco zdekonstruowane do słowników: czyli w pliku wejściowym znajdują się wielopoziomowe "dyktury" zawierające parę kluczowe ".

Mam słownik słownika, który informuje o funkcji read, które klucze do odczytu i sposobu analizowania kluczowych wartości.

Na przykład, można zobaczyć w fragmencie kodu poniżej tego, gdy odczytuje się datum, wartość powinna być analizowana za pomocą funkcji HelperFunctions.split_to_floats:

'datum': HelperFunctions.split_to_floats

Cel

Chciałbym zrobić, to być w stanie przejść w argumentach, tak że nie muszę wykonać zezwoleń na funkcje dla każdego możliwego rodzaju I.E.

Na przykład, aby zrestrukturyzować słownik keywords w czymś takim jak:

keywords = {
    '_root': str,
    'units': HelperFunctions._split(LINE,to=str,delim=','),
    'datum': HelperFunctions._split(LINE,to=float,delim=' ')
    }

Przykład kodu

Pełny, roboczy demo tego, co obecnie mam, jest reprodukowane poniżej:

class HelperFunctions:

    def comma_split_to_strings(string:str) -> list:
        # Returns a list of strings
        return string.split(',')

    def split_to_floats(string:str) -> list:
        # Returns a 1D list of floats
        return list(map(float,string.split()))


keywords = {
    '_root': str,
    'units': HelperFunctions.comma_split_to_strings,
    'datum': HelperFunctions.split_to_floats
    }

card = {}
key = 'units'
value = 'Pa,kg,km'

if key in keywords:
    cast = keywords[key]

    card[key] = cast(value)
1
Daniel R. Livingston 20 luty 2019, 23:37

2 odpowiedzi

Najlepsza odpowiedź

To, czego szukasz Umożliwia tworzenie funkcji z niektórymi parametrami związanymi do wartości, które można wywołać funkcję zwracaną później za pomocą brakujących wartości.

from functools import partial

# Bind the parameters you want to "freeze"
keywords = {
    '_root': str,
    'units': partial(HelperFunctions._split, to=str, delim=','),
    'datum': partial(HelperFunctions._split, to=float, delim=' ')
    }

# The later you just need to provide LINE
keywords['units'](LINE)
5
Ryan Widmaier 20 luty 2019, 20:45

Szukasz functools.partial?

from functools import partial

keywords = {
    '_root': str,
    'units': partial(HelperFunctions._split, to=str, delim=','),
    'datum': partial(HelperFunctions._split, to=float, delim=' ')
}
2
chepner 20 luty 2019, 20:44