Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 10, 2011 18:29:19

CHAOS
От:
Зарегистрирован: 2011-11-19
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Оцените код новичка

Нет, нет, я никуда не исчезал и Python не бросал, просто, иногда приходится работать:(



Офлайн

#2 Дек. 13, 2011 21:20:28

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Оцените код новичка

Бывает :)



Офлайн

#3 Янв. 16, 2012 11:40:25

CHAOS
От:
Зарегистрирован: 2011-11-19
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Оцените код новичка

Доброго времени и с прошедшими праздниками! Прошел уже целый месяц с момента последней публикации! Извиняюсь за эту паузу. Работа, а затем праздники - это страшное дело. Несколько моментов, Ed:

Пункт 2. total = len(matches). По старой привычке - это некий кэш. В Python в таких вещах нет необходимости?
3. Эти строчки, видимо, остались из какой-то старой версии. Никакого смысла сейчас в них нет, это правда.
5. Какая разница в наличии скобок? Кортеж - он и есть кортеж.
6. Длинных строк нет - проверяется с помощью pylint.

Плюс я попробовал перенести все это хозяйство на третью версию “Питона”. Код:

# -*- coding: utf-8 -*-

"""Не секрет, что сервис imagevenue.com меняет адрес картинки каждый раз
при обновления страницы. Не так-то просто загрузить несколько картинок
сразу в данной ситуации. Эта программа призвана упростить данный процесс.

Также с ее помощью можно загружать материалы с imageshack.us и по прямым
ссылкам. Пример:

linkshop.py -l '<a href="imagevenue.com"></a><a href...' -d /каталог

"""

import re
import os
from sys import stderr
from urllib.request import urlopen, urlretrieve
from optparse import OptionParser
from urllib.parse import urlparse


def get_options():
"""Получает опции и аргументы командной строки."""
parser = OptionParser()
parser.add_option('-d', '--dir', default='', help='каталог для загрузки')
options, args = parser.parse_args()

if not args:
parser.error('неверное количество аргументов')

return options, args


def download(options, args):
"""Получает адреса страниц из href-атрибутов аргумента,
который должен быть обычным HTML-кодом. Используя адреса,
загружает страницы, находит там картинки и их тоже загружает.

"""

matches = re.findall('href="(.+?)"', args)

if not matches:
return

for (key, url) in enumerate(matches):
print('\n%s из %s (%s)\nПолучение страницы...' % (key + 1,
len(matches), url))

try:
url_open = urlopen(url)
except ValueError:
stderr.write('Неверный формат ссылки\n')
continue

try_again = 'y'

while try_again == 'y':
url_open = urlopen(url)
content = url_open.read()
url_open.close()

if not content:
try_again = input('ERROR. Попробовать еще раз? (y or n)')
else:
break

url_parsed = urlparse(url)
netloc = url_parsed.netloc

if 'imageshack' in netloc:
matches = re.search('<link rel="image_src" href="(.+?)"',
content)
url = matches.group(1)
elif 'imagevenue' in netloc:
matches = re.search('SRC="(.+?)"', content)
url = 'http://%s/%s' % (netloc, matches.group(1))

print('Загрузка картинки...')
url_parsed = urlparse(url)
file_name = url_parsed.path.split('/')[-1]
down_name, _headers = urlretrieve(url,
os.path.join(options.dir, file_name))

if os.path.isfile(down_name):
print('OK')
else:
stderr.write('ERROR\n')


if __name__ == '__main__':
OPTIONS, ARGS = get_options()
download(OPTIONS, ARGS[0])



Отредактировано CHAOS (Сен. 8, 2012 14:11:50)

Офлайн

#4 Янв. 16, 2012 11:58:36

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Оцените код новичка

def get_options():
"""Get command-line options"""
parser = OptionParser()
parser.add_option('-l', '--links')
parser.add_option('-d', '--dir', default='/media/sda5/tmp/images')
(options, args) = parser.parse_args()
return options
Может я что-то не так понял, но зачем этот код помещать в функцию?



Офлайн

#5 Янв. 16, 2012 12:27:26

CHAOS
От:
Зарегистрирован: 2011-11-19
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Оцените код новичка

Можно и не помещать. Просто это какая-то привычка: все помещать в какую-то обвертку…



Офлайн

#6 Янв. 16, 2012 14:29:10

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Оцените код новичка

CHAOS
Можно и не помещать. Просто это какая-то привычка: все помещать в какую-то обвертку…
Вызов пользовательской функции - дорогая операция
from __future__ import print_function
from timeit import Timer
time=Timer()

def f():
pass

t1=time.timer()
for i in xrange(1000000):
f()

t2=time.timer()-t1
print ('def',t2)

t1=time.timer()
for i in xrange(1000000):
pass

t2=time.timer()-t1
print ('not def',t2)
def 0.246202945709
not def 0.0379729270935



Офлайн

#7 Янв. 16, 2012 14:40:57

CHAOS
От:
Зарегистрирован: 2011-11-19
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Оцените код новичка

Спасибо, обязательно сделаю подобный тест у себя!



Офлайн

#8 Янв. 16, 2012 15:18:05

CHAOS
От:
Зарегистрирован: 2011-11-19
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Оцените код новичка

Скоростной тест проведен. Результаты близки до безобразия. С функцией:

0.000495910644531
0.00039005279541
0.000401020050049
0.000391960144043
0.000403881072998
0.000396966934204

Без:

0.000401973724365
0.000499963760376
0.000385999679565
0.000396013259888
0.000398874282837
0.000473022460938



Офлайн

#9 Янв. 16, 2012 15:23:29

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Оцените код новичка

CHAOS
Скоростной тест проведен. Результаты близки до безобразия. С функцией:

0.000495910644531
0.00039005279541
0.000401020050049
0.000391960144043
0.000403881072998
0.000396966934204

Без:

0.000401973724365
0.000499963760376
0.000385999679565
0.000396013259888
0.000398874282837
0.000473022460938
1. Запусти мой пример и проверь
2. Покажи свой скрипт, которым тестил



Офлайн

#10 Янв. 16, 2012 15:37:52

CHAOS
От:
Зарегистрирован: 2011-11-19
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Оцените код новичка

Отдельно тест провел - бесспорно быстрее (в три раза), но в моем случае разницы нет. С вызовом функции:

if __name__ == '__main__':
timer = Timer()
start = timer.timer()
OPTIONS, ARGS = get_options()
print(timer.timer() - start)
Соответственно:

if __name__ == '__main__':
timer = Timer()
start = timer.timer()
parser = OptionParser()
parser.add_option('-d', '--dir', default='', help='каталог для загрузки')
options, args = parser.parse_args()

if not args:
parser.error('неверное количество аргументов')

print(timer.timer() - start)



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version