Zastanawiam się, czy istnieje sposób, aby użyć Variablelist z Namidtuple, aby sformatować sznur efektywnie taki jak:

TestResult = collections.namedtuple('TestResults', 'creation_time filter_time total_time')

test = TestResult(1, 2, 3)
string_to_format = '{creation_time}, {filter_time}, {total_time}'.format(test)

Zamiast pisać:

string_to_format = '{}, {}, {}'.format(test.creation_time, test.filter_time, test.total_time)

Jeśli jest sposób, aby to zrobić, czy byłoby uważany za Pythonic?

Dziękuję Ci za Twoje odpowiedzi

7
kachink 2 czerwiec 2018, 12:49

4 odpowiedzi

Najlepsza odpowiedź

Możesz to zrobić:

>>> string_to_format = '{0.creation_time}, {0.filter_time}, {0.total_time}'.format(test)
>>> string_to_format
'1, 2, 3'

Czy to pytalne? Nie wiem, ale robi dwie rzeczy, które są uważane za piython: 1. Nie powtarzaj się! (test występuje tylko raz) i 2. Bądź wyraźny! (Nazwy w nazwie są używane)

9
Paul Panzer 2 czerwiec 2018, 10:49

Możesz go przekonwertować do słownika i użyć go jako parametrów dla format:

test = TestResult(1, 2, 3)
s = '{creation_time}, {filter_time}, {total_time}'.format(**test._asdict())
print(s)  # 1, 2, 3
1
Norrius 2 czerwiec 2018, 09:58

Twoja próba była blisko. Powinieneś się zmienić

'{creation_time}, {filter_time}, {total_time}'.format(test)

Do

'{test.creation_time}, {test.filter_time}, {test.total_time}'.format(test=test)
1
DeepSpace 2 czerwiec 2018, 09:56

Możesz użyć _asdict() Metoda Zamień swoją nazwę do dyktonu, a następnie rozpakowywać to Z operatorem **:

test = TestResult(1, 2, 3)

string_to_format = '{creation_time}, {filter_time}, {total_time}'
print(string_to_format.format(**test._asdict()))
# output: 1, 2, 3
5
Aran-Fey 2 czerwiec 2018, 09:58