Улучшить код

Модератор: Модераторы разделов

Ответить
Аватара пользователя
delvin-fil
Сообщения: 135
ОС: Linux → Gentoo

Улучшить код

Сообщение delvin-fil »

Есть файл JSON
Есть
код

Shell

#!/usr/bin/env python3.9

import json
import re
from collections import Counter

with open('/home/delvin/codding/pogoda/sensorsNearby.json') as json_facta:
fact = json.load(json_facta)
json_facta.close()
array = fact['devices']
numkeys = Counter(i for val in array for i in val)['id']
startnum = 0
sensor = 0
unit = ''
pressure = 0

while startnum <= numkeys:
for device in fact['devices']:
if device['location'] == "Ленинск-Кузнецкий, Городская ул., 10":
pressure = device['id']
temperature = device['sensors'][-1]['value']
temperature = round(temperature)
unit = device['sensors'][-1]['unit']
startnum += 1

print (f"{temperature}{unit}")
Что можно сделать, чтоб было и красиво, и PEP соответствовало?
Спасибо!
import __hello__
Спасибо сказали:
astroncia
Сообщения: 133

Re: Улучшить код

Сообщение astroncia »

pylint

Код: Выделить всё

************* Module test
test.py:1:0: C0114: Missing module docstring (missing-module-docstring)
test.py:7:5: W1514: Using open without explicitly specifying an encoding (unspecified-encoding)
test.py:12:0: C0103: Constant name "startnum" doesn't conform to UPPER_CASE naming style (invalid-name)
test.py:13:0: C0103: Constant name "sensor" doesn't conform to UPPER_CASE naming style (invalid-name)
test.py:14:0: C0103: Constant name "unit" doesn't conform to UPPER_CASE naming style (invalid-name)
test.py:15:0: C0103: Constant name "pressure" doesn't conform to UPPER_CASE naming style (invalid-name)
test.py:4:0: W0611: Unused import re (unused-import)
 
------------------------------------------------------------------
Your code has been rated at 6.67/10 (previous run: 6.67/10, +0.00)
Спасибо сказали:
Аватара пользователя
delvin-fil
Сообщения: 135
ОС: Linux → Gentoo

Re: Улучшить код

Сообщение delvin-fil »

astroncia писал:
25.08.2021 13:24
pylint
Да понятно с этим. А может в ООП?
import __hello__
Спасибо сказали:
Аватара пользователя
s.xbatob
Сообщения: 1139
ОС: Fedora

Re: Улучшить код

Сообщение s.xbatob »

Всё так. Если что и не так, то общий дизайн приложения. Весь код отправляется в модуль, а исполняемый файл только его загружает и запускает. А тут цепляются ко всякой фигне
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2600
ОС: Gentoo

Re: Улучшить код

Сообщение ormorph »

Хм, непонятно зачем вообще используется цикл while, он выполняет дурную работу. Можно на много проще сделать:
Spoiler

Shell

#!/usr/bin/env python3.9

import json

with open('sensorsNearby.json') as json_facta:
fact = json.load(json_facta)
json_facta.close()
array = fact['devices']
sensor = 0
unit = ''
pressure = 0
for device in fact['devices']:
if device['location'] == "Ленинск-Кузнецкий, Городская ул., 10":
pressure = device['id']
temperature = device['sensors'][-1]['value']
temperature = round(temperature)
unit = device['sensors'][-1]['unit']
print(f"{temperature}{unit}")
Можно ещё убрать переменные pressure и array, в общем не совсем понятна задумка автора.
Спасибо сказали:
Аватара пользователя
delvin-fil
Сообщения: 135
ОС: Linux → Gentoo

Re: Улучшить код

Сообщение delvin-fil »

ormorph писал(а):
26.08.2021 20:10
Можно ещё убрать переменные pressure и array
Спасибо!
Задумка проста - вытащить ключи id, как в которых есть определенные значения.
Например, мне нужен номер device в котором содержатся unit:° и unit:mmHg.
import __hello__
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2600
ОС: Gentoo

Re: Улучшить код

Сообщение ormorph »

delvin-fil писал:
29.08.2021 08:36
Например, мне нужен номер device в котором содержатся unit:° и unit:mmHg.
Можно так:
Spoiler

Shell

import json

with open('sensorsNearby.json') as json_facta:
fact = json.load(json_facta)
json_facta.close()
array = fact['devices']
index=0
AA=set()
for device in fact['devices']:
for sensor in device['sensors']:
if '°' in sensor['unit']:
AA.add('°')
if 'mmHg' in sensor['unit']:
AA.add('mmHg')
if AA.intersection(set(['°', 'mmHg'])) == set(['°', 'mmHg']):
print(index)
AA=set()
index+=1
Но возможно вы нашли лучшее решение. Но можно и это упростить. Просто добавить все юниты определенной итерации в множество(типа AA.add(sensor['unit'])), а множества уже сравнивать на предмет пересечения.
Спасибо сказали:
Ответить