Форум сайта python.su
RodegastПредложете замену?
В третьем функция отработала, но она мне всё равно не нравится.
RodegastПодусловий там много, но уровень вложенности один. Атрибут может менять значение в зависимости от типа накопителя. Покажете пример, как это сделать со словарями? Есть сомнение, что получится компактнее.
Там только 1 подусловие, по этому его можно заменить на 2 словаря.
Офлайн
kazenniyНапример
Покажете пример, как это сделать со словарями?
{(206, True): "Unknown_SSD_Attribute", (206, False): "Flying_Height", (207, True): "Unknown_SSD_Attribute", (207, False): "Spin_High_Current"}[(id_, self.ssd)]
Офлайн
А если атрибут имеет одно значение при любом типе диска, его обязательно тоже дважды прописывать или можно как-то сократить?
Офлайн
kazenniyМожно сокращать, можно не сокращать. Комбинировать условия со словарями никто не возбраняет, а большой словарь будет ещё и быстрее большого блока альтернатив.
А если атрибут имеет одно значение при любом типе диска, его обязательно тоже дважды прописывать или можно как-то сократить?
Офлайн
Попробую перевести самый большой блок в словари и сравню размеры.
Офлайн
> Подусловий там много, но уровень вложенности один.
Никаких подусловий кроме self.ssd я не увидел.
> Покажете пример, как это сделать со словарями?
if self.ssd: return {1:"Raw_Read_Error_Rate", 2:"Throughput_Performance", 6:"Unknown_SSD_Attribute"}.get(Id, "Unknown_Attribute") else: return {1:"Raw_Read_Error_Rate", 2:"Throughput_Performance", 6:"Read_Channel_Margin"}.get(Id, "Unknown_Attribute")
Отредактировано Rodegast (Окт. 31, 2016 22:08:49)
Офлайн
Да, в таком виде код выглядит намного опрятнее. Перепишу все таким образом.
Вот бы еще перевети в подобную форму такие сравнения:
if cap & 0x800:
self.sataGen = "Gen.3 (6.0Gb/s)"
elif cap & 0x400:
self.sataGen = "Gen.2 (3.0Gb/s)"
elif cap & 0x200:
self.sataGen = "Gen.1 (1.5Gb/s)"
else:
self.sataGen = ""
Офлайн
Разобрался, как можно сделать. Обновил код на гитхабе. Огромное спасибо за наводку!
Попутно узнал, что ключем словаря может быть даже условие, ведь оно будет вычисляться на момент создания словаря.
def get_temp_description(temp):
return {
temp < -20: 'Холодно',
-20 <= temp < 0: 'Прохладно',
0 <= temp < 15: 'Зябко',
15 <= temp < 25: 'Тепло',
25 <= temp: 'Жарко'
}[True]
Офлайн