Уведомления

Группа в Telegram: @pythonsu

#1 Май 17, 2018 04:19:41

irgit
Зарегистрирован: 2018-02-04
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Говнокод. Научите изяществу

vic57
как коллеги сказали - данные нужно отделять от функции.
и у тебя нет обработки ошибок совсем
примерно так

Спасибо огромное! Очень конкретный и дельный совет! Теперь понимаю, как я был не прав! Супер, продолжу копать в эту сторону, и если позволите, у меня будут дополнительные вопросы к Вам)

Офлайн

#2 Май 17, 2018 04:29:37

irgit
Зарегистрирован: 2018-02-04
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Говнокод. Научите изяществу

vic57
как коллеги сказали - данные нужно отделять от функции.
и у тебя нет обработки ошибок совсем
примерно так

 import requests
DATA = {}
DATA['req']='https://api.vk.com/method/database.getCities.jsonregion_id=1157049&country_id=1&count=200&access_token='
DATA['token'] = 'TOKEN'
DATA['version'] = '&v=5.52'
def get_multicity(url=None):
    try:
        r = requests.get(url,timeout=5)
    except Exception as e:
        return {'ERROR':str(e)}
    else:
        return r.json()
ret = get_multicity(DATA['req'] + DATA['token'] + DATA['version'])
print(ret)


Реально, шикарная конструкция. У меня вопрос. Контроль ошибок нужно делать всегда, где они возможны? Или только там, где они критичны?

Отредактировано irgit (Май 17, 2018 04:31:24)

Офлайн

#3 Май 17, 2018 06:27:48

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

Говнокод. Научите изяществу

irgit
Контроль ошибок нужно делать всегда, где они возможны? Или только там, где они критичны?
в сети - лучше везде. хз где в инете что отвалится.

Офлайн

#4 Май 17, 2018 07:24:54

irgit
Зарегистрирован: 2018-02-04
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Говнокод. Научите изяществу

vic57
в сети - лучше везде. хз где в инете что отвалится.
Спасибо) Посмотрите пожалуйста фрагмент, который основан на вашей конструкции, если все верно, значит я правильно понял?:
1) дробить сложное на простое
2) включать проверку ошибок - где только можно: особенно если это касается нестабильных источников
3) Размер кода не имеет значение, большую важность имеет структура

 from urllib.request import urlopen
import json
URL = {}
URL["token"] = "access_token=blabla"
URL["vk_getCities"] = "https://api.vk.com/method/database.getCities.json?"
URL["count"] = "count=1000"
URL["version_vkapi"]="v=5.52"
URL["&"] = "&"
URL["region_id"] = "region_id=1157049"
URL["country_id"] = "country_id=1"
def get_city(city=True):
    try:
        urlcity =(URL["vk_getCities"]+URL["country_id"]+URL["&"]+URL["region_id"]+URL["&"]+URL["count"]+URL["&"]+URL["token"]+URL["&"]+URL["version_vkapi"])
        response = urlopen(urlcity,timeout=1)
        data = response.read()
        city = json.loads(data)
    except Exception as e:
        return {'ERROR': str(e)}
    else:
        return city
print (get_city())

Отредактировано irgit (Май 17, 2018 07:25:48)

Офлайн

#5 Май 17, 2018 07:56:46

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

Говнокод. Научите изяществу

irgit
URL = “&”
ну это уже лишнее
для разовой работы пойдет, если запросов будет много, можно сделать ф-цию типа get_url(), возвращающую текст запроса.
основной принцип кибернетики - черный ящик. я не знаю что внутри, я знаю что на определенное воздействие идет определенный отклик.
во времена MS-DOS было правило - код функции должен помещаться в экран монитора (25 строк), или ее никто и читать не будет. а любое усложнение повышает вероятность скрытых ошибок.
 urlcity =
 (URL["vk_getCities"]+URL["country_id"]+URL["&"]+URL["region_id"]+URL["&"]+URL["count"]+URL["&"]+URL["token"]+URL["&"]+URL["version_vkapi"])
не усложняй без нужды
 >>> l = ['val1','val2','val3']
>>> '&'.join(l)
'val1&val2&val3'
>>> 

Отредактировано vic57 (Май 17, 2018 08:02:27)

Офлайн

#6 Май 17, 2018 08:04:25

rami
Зарегистрирован: 2018-01-08
Сообщения: 280
Репутация: +  71  -
Профиль   Отправить e-mail  

Говнокод. Научите изяществу

Вместо “склеивания”:

 urlcity =(URL["vk_getCities"]+URL["country_id"]+URL["&"]+URL["region_id"]+URL["&"]+URL["count"]+URL["&"]+URL["token"]+URL["&"]+URL["version_vkapi"])
лучше форматированная строка:
 urlcity=f'{URL["vk_getCities"]}{URL["country_id"]}{URL["&"]}{URL["region_id"]}&{URL["count"]}&{URL["token"]}&{URL["version_vkapi"]}'

P.S. хотя, в данном случае ещё лучше как предложил vic57 с помощью join

Отредактировано rami (Май 17, 2018 08:15:14)

Офлайн

#7 Май 17, 2018 08:20:10

irgit
Зарегистрирован: 2018-02-04
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Говнокод. Научите изяществу

vic57
во времена MS-DOS было правило - код функции должен помещаться в экран монитора (25 строк), или ее никто и читать не будет. а любое усложнение повышает вероятность скрытых ошибок.
Чётко сказано!
vic57
'&'.join(l)
Круть! Похоже, начинаю понимать, что такое рефакторинг (это модное слово только сегодня узнал)

rami
лучше форматированная строка:
ok, ,буду знать.

Ребята, спасибо огромное! Похоже, начинаю понимать эстетику красивого кода)

Офлайн

#8 Май 17, 2018 08:43:30

irgit
Зарегистрирован: 2018-02-04
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Говнокод. Научите изяществу

 from urllib.request import urlopen
import json
URL = {}
URL["vk_getCities"] = "https://api.vk.com/method/database.getCities.json?"
URL["country_id"] = "country_id=1"
URL["region_id"] = "region_id=1157049"
URL["count"] = "count=1000"
URL["token"] = "access_token=blabla"
URL["version_vkapi"]="v=5.52"
def get_city(city=True):
    try:
        urlcity = ("&".join(URL.values()))
        response = urlopen(urlcity,timeout=1)
        data = response.read()
        city = json.loads(data)
    except Exception as e:
        return {'ERROR': str(e)}
    else:
        return city
print (get_city())

Как все просто, начинаю обожать питон)))
Возник простой вопрос: значения URL лучше всего выносить за функцию, или лучше внутри, с условием того, что она используется один раз?

Отредактировано irgit (Май 17, 2018 08:47:18)

Офлайн

#9 Май 17, 2018 15:24:58

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

Говнокод. Научите изяществу

если один, то опять же не стоит усложнять.

 >>> def f(url):
	try:
		r = requests.get(url,timeout=3)
	except Exception as e:
		return str(e)
	else:
		return r.status_code
	
>>> urls = ['ya.ru','mail.ru','google.com','mail.b']
>>> 
>>> for url in urls:
	print(f('http://' + url))
	
200
200
200
HTTPConnectionPool(host='mail.b', port=80): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x10483edd8>: Failed to establish a new connection: [Errno 8] nodename nor servname provided, or not known',))
>>> 
https://cloud.mail.ru/public/NE3b/F48pCGtqM
неплохая подборка по питону

Отредактировано vic57 (Май 17, 2018 15:42:59)

Офлайн

#10 Май 18, 2018 04:49:21

irgit
Зарегистрирован: 2018-02-04
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Говнокод. Научите изяществу

vic57
https://cloud.mail.ru/public/NE3b/F48pCGtqM
неплохая подборка по питону

Спасибо большое!!!

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version