Найти - Пользователи
Полная версия: Говнокод. Научите изяществу
Начало » Python для новичков » Говнокод. Научите изяществу
1 2 3 4 5
irgit
vic57
как коллеги сказали - данные нужно отделять от функции.
и у тебя нет обработки ошибок совсем
примерно так

Спасибо огромное! Очень конкретный и дельный совет! Теперь понимаю, как я был не прав! Супер, продолжу копать в эту сторону, и если позволите, у меня будут дополнительные вопросы к Вам)
irgit
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)


Реально, шикарная конструкция. У меня вопрос. Контроль ошибок нужно делать всегда, где они возможны? Или только там, где они критичны?
vic57
irgit
Контроль ошибок нужно делать всегда, где они возможны? Или только там, где они критичны?
в сети - лучше везде. хз где в инете что отвалится.
irgit
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())
vic57
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'
>>> 
rami
Вместо “склеивания”:
 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
irgit
vic57
во времена MS-DOS было правило - код функции должен помещаться в экран монитора (25 строк), или ее никто и читать не будет. а любое усложнение повышает вероятность скрытых ошибок.
Чётко сказано!
vic57
'&'.join(l)
Круть! Похоже, начинаю понимать, что такое рефакторинг (это модное слово только сегодня узнал)

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

Ребята, спасибо огромное! Похоже, начинаю понимать эстетику красивого кода)
irgit
 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 лучше всего выносить за функцию, или лучше внутри, с условием того, что она используется один раз?
vic57
если один, то опять же не стоит усложнять.
 >>> 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
неплохая подборка по питону
irgit
vic57
https://cloud.mail.ru/public/NE3b/F48pCGtqM
неплохая подборка по питону

Спасибо большое!!!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB