LINUX.ORG.RU

покомментируйте код

 , ,


0

3
class PluginImpl(object):

    ...

    def download_repomd(self):
        " May throw if repomd.xml does not exists at server "
        with open(os.devnull, 'w') as FNULL:
            return check_output([
                "wget", self.mtdt_url + "repomd.xml", "-O-"
            ], stderr=FNULL).decode("utf-8")

    ...

        def _sync(self, url, input_file, target):
        " this is exception safe (unless something unexpected will happen) "
        # if file that will be synced does not exists, this should be aborted
        if not os.path.isfile(input_file):
            check_output(["touch", input_file])
        try:
            zsync = Popen(["zsync", url, "-i", input_file, "-o",
                           target], stdout=PIPE, stderr=PIPE)
            outputs = zsync.communicate()
            if self._print_log:
                print(outputs[1].decode("utf-8"))
                print(outputs[0].decode("utf-8"))
        except CalledProcessError as ex:
            # print(str(ex), file=sys.stderr)
            # reverse rewriting existing if there was any
            try:
                check_output(["mv", target + ".zs-old", target])
            except:
                pass
        else:
            # cleanup
            check_output(["rm", "-rf", target + ".zs-old",
                          input_file if input_file != target else ""])
        return zsync.returncode

P.S. мопед не мой

★★★★

Последнее исправление: i_gnatenko_brain (всего исправлений: 1)

Синтаксическая ошибка, неверная индентация.
Докстринги так не пишутся вроде.
Код — говно.

Goury ★★★★★
()

mtdt_url

Если лень было написать metadata, то можно было бы просто оставить url, а то не сразу понятно, что это mtdt значит.

Строки документации оформляются тройными кавычками.

iter_repodata Используется аж один раз. Непонятно, почему нельзя сразу воспользоваться re.finditer. Ещё там регулярку можно тоже в константу вынести, а сами константы сразу после определения класса запихнуть, а то там одна единственная где-то в середине сидит.

rm -rf

shutil.rmtree

И ещё мне кажется странным парсить xml регулярками.

Kilte ★★★★★
()
Ответ на: комментарий от conformist

Инденты даже на глаз в порядке.

Я бы вместо

return check_output([
                "wget", self.mtdt_url + "repomd.xml", "-O-"
            ], stderr=FNULL).decode("utf-8")

написал бы
return check_output(
                ["wget", self.mtdt_url + "repomd.xml", "-O-"],
                stderr=FNULL
       ).decode("utf-8")


А вместо
zsync = Popen(["zsync", url, "-i", input_file, "-o",
              target], stdout=PIPE, stderr=PIPE)

написал бы
zsync = Popen(["zsync", url, "-i", input_file, "-o", target],
              stdout=PIPE, stderr=PIPE)

proud_anon ★★★★★
()

Недавно заказчик просил тулзу для анализа логов asap, знающие питонисты меня ткнули носом сюда https://www.python.org/dev/peps/pep-0008/ Да, я не питонщик, и мне было фиолетово на оформление кода, т.к. сроки горели, но тоже считаю, что code convention уважать нужно, в какой бы язык ты не залез.

bytecode ★★
()
Последнее исправление: bytecode (всего исправлений: 1)
Ответ на: комментарий от proud_anon

Очень не люблю, когда так делают. Я конечно в курсе, что IDE/редактор могут сами пробелы расставить, но предпочитаю всё же не выравнивать.

Kilte ★★★★★
()
python
import subprocess.py
help(subprocess.check_output)
help(subprocess)
^Z
less /usr/lib/python2.7/subprocess.py || surf http://docs.python.org/3.4/library/subprocess

#anyway read this

def check_output(*popenargs, **kwargs):
    r"""Run command with arguments and return its output as a byte string.

    If the exit code was non-zero it raises a CalledProcessError.  The
    CalledProcessError object will have the return code in the returncode
    attribute and output in the output attribute.

    The arguments are the same as for the Popen constructor.  Example:

    >>> check_output(["ls", "-l", "/dev/null"])
    'crw-rw-rw- 1 root root 1, 3 Oct 18  2007 /dev/null\n'

    The stdout argument is not allowed as it is used internally.
    To capture standard error in the result, use stderr=STDOUT.

    >>> check_output(["/bin/sh", "-c",
    ...               "ls -l non_existent_file ; exit 0"],
    ...              stderr=STDOUT)
    'ls: non_existent_file: No such file or directory\n'
    """
    if 'stdout' in kwargs:
        raise ValueError('stdout argument not allowed, it will be overridden.')
    process = Popen(stdout=PIPE, *popenargs, **kwargs)
    output, unused_err = process.communicate()
    retcode = process.poll()
    if retcode:
        cmd = kwargs.get("args")
        if cmd is None:
            cmd = popenargs[0]
        raise CalledProcessError(retcode, cmd, output=output)
    return output

Зачем использовать функцию которая отдельно бросает исключения что бы затем её оборачивать в подавление исключений.

есть «более лучше предназначение» для целей автора сего шедевра модули с функциями делающие ровно то что нужно.

egro

читайте сырцы того чем пользуютесь

ззы. и да сочетания в одном фунцкии высокоуровневого(относительно попен) чек_отпут с прямого вызова попен - это очень варварски.

qulinxao ★★☆
()
Ответ на: комментарий от i_gnatenko_brain

считаешь автору стоило просто

os.system уметь?

qulinxao ★★☆
()

Зачем тебе дергать mv, rm, wget если у тебя язык высокого уровня с огромным набором либ? Про zsync не скажу, но вот такое нагуглилось, не в курсе насколько релевантно. И да, отступы.

zunkree
()
Последнее исправление: zunkree (всего исправлений: 2)
Ответ на: комментарий от Virtuos86

Что не знает, на том и делает. Какие вопросы?

Как бы можно написать в гугле «how to get data from site python». Не?

xpahos ★★★★★
()
Ответ на: комментарий от xpahos

ОП мне отвечал на похожий вопрос. Что-то вроде того, что «и мне наука, и другим может пригодиться», если не путаю.

Virtuos86 ★★★★★
()
Ответ на: комментарий от anonymous

Обычный real код, работающий с I/O, где ошибка может возникнуть при любой операции, и эту ошибку надо учитывать, обкладывая обработчиками исключений.

Virtuos86 ★★★★★
()
Ответ на: комментарий от proud_anon

Как что? Отступы с выравниванием.

Вместо этого:

return check_output(
                ["wget", self.mtdt_url + "repomd.xml", "-O-"],
                stderr=FNULL
       ).decode("utf-8")

zsync = Popen(["zsync", url, "-i", input_file, "-o", target],
              stdout=PIPE, stderr=PIPE)

Написал бы:

return check_output(
    ["wget", self.mtdt_url + "repomd.xml", "-O-"],
    stderr=FNULL
).decode("utf-8")

zsync = Popen(
    ["zsync", url, "-i", input_file, "-o", target], 
    stdout=PIPE, 
    stderr=PIPE
)

Kilte ★★★★★
()
  • Про использование subprocess.* вместо использования либ уже сказали. Вызов touch - это вин.
  • Где-то выше похоже есть «from subprocess import *».
  • print()
  • Вместо os.path.isfile() по смыслу больше подходит os.path.exists().
  • zsync.returncode не проверяется там где надо (внутри try-блока с zsync.communicate). CalledProcessError там не выбросится в случае фейла.
  • check_output([«mv», target + ".zs-old", target]) намекает на то, что старые данные перемещаются в какое-то временное место, на их старое место записываются новые данные, и в случае успеха старые данные просто удаляются. По хорошему, нужно делать наоборот: новые данные писать по временному пути, и в случае успеха перемещать на место старых данных (если возможно, атомарно).
Deleted
()
Ответ на: комментарий от xpahos

P.S. мопед не мой

И это насколько я понял, это плагин к пакетному менеджеру dnf.

Kilte ★★★★★
()

this is exception safe (unless something unexpected will happen)

Просто ЛОЛ.

print(outputs[1].decode(«utf-8»))
print(outputs[0].decode(«utf-8»))

А сразу в нормально названные переменные никак нельзя это запихнуть?

check_output([«touch», input_file])
check_output([«rm», "-rf", target + ".zs-old", input_file if input_file != target else «„])

Конечно, без запуска шелла никак нельзя обойтись. Нафига вообще питон - тут всё можно сразу на bash сделать и получится в 5 раз короче.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)

покомментируйте код

Ваш код говно.(с)

EugeneBas ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.