Pull to refresh

Comments 17

Будет ли что-то с применением Ansible?
Почему на КДПВ за компом сидит кто-то криворукий? :)
Вот щас обидно было :)
Какой-то у вас Python очень непитонистый. Одно только «b.__len__()» вместо «len(b)» чего стоит… Это намеренное запутывание кода что-ли?
Да, будто специально в четыре десятка строк ошибки вталкивали. Чего стоит одно форматирование — кругом «» вместо "". Код уже не скопипастить, надо ещё каким-нибудь sed-ом пройтись.
Какая-то свежая конструкция:
if command <> '':

Просто классика:
if a==None:

Вот это тоже мило:

print
print(res)


Это какая версия Python вообще? =) для второй лишние скобки, для третьей наоборот отсутствуют.

WAT?

while 2<3:


Словом, есть и получше уроки.
Еще перл:
    a, b = ops.terminal.write(«>>>«,vty = VTY)
    a, b = ops.terminal.read(maxLen = 200,timeout = 60,vty=VTY)
    if a==None:
        a='q';
    return a


Первый раз значения присваиваются, но не используются. Зачем? Все это проще записать так:
    ops.terminal.write(">>>", vty=VTY)
    a, _ = ops.terminal.read(maxLen=200, timeout=60, vty=VTY)
    return a if a else 'q'


Ребята! Если у вас внутри такой код, то я никакую вашу продукцию не куплю!

Это явно писал человек, не удосужившийся прочитать даже Python Tutorial (и точно не читавший PEP-8).
Я действительно не гуру питона, и эта статься не урок питона на оборудовании Huawei. Статья прежде всего показывает как писать скрипты на оборудовании Huawei и как писать в файл.
Она ориентирована не на программистов, а на сетевых администраторов.
Много вы встречали документации на TCL и, прежде всего, его API, когда его только встроили в Cisco?
Тот факт, что переменные не анализируются, говорит о том, что из кода убраны проверки, для уменьшения размера кода. Про конструкцию «a, _» согласен, нужно было бы заменить.
Я думаю, что документация по TCL существовала отдельно от оборудования Cisco и была очень хорошей.

Тут дело в том, что совершенно очевидно, что человек, писавший код, даже не прочитал Python Tutorial. То есть, просто взял скопипастил вместе какие-то куски кода, нарушая все писаные и неписанные стандарты кода на Python. Такого кода в мире очень много, я это знаю, так как регулярно с ним встречаюсь всю жизнь. И эти костыли кое-как в идеальных условиях иногда даже работают.

Но данный подход всегда приводит к проблемам. Этот отвратительный код всегда невозможно поддерживать. Вы в скрипте из 5-10 строчек наделали ошибок практически в каждой строчке. Когда ваш код вырастет до сотен и тысяч строк, это будет прост клубок костылей, скрепленный резинками и скотчем. И малейшие изменения или исправления будут выливаться в огромную головную боль.

Да, хорошо сказать: «этот код не вызывает синтаксических ошибок интерпретатора и вроде как работает, я умываю руки». Но такой подход никогда не бывает масштабируемым.

И вообще, неужели так сложно час потратить на чтение хотя бы Python Tutorial, входящего в состав любого дистрибутива Python? Быстрее надо лес рубить, некогда топор точить?
Вы пишете, что «Вы в скрипте из 5-10 строчек наделали ошибок практически в каждой строчке.» что вы подразумеваете под ошибками?
Это не урок по питону. Это дополнение к документации, в которой не все можно найти, прежде всего очень сильно хромает та часть, где описан API работы с файлами.
Статья сильно отредактирована, видимо в процессе редактирования у кого-то редактор заменил кавычки '' на «», так же убраны мои извинения за корявость кода и прежде всего за конструкцию while 2<3:, ну а конструкция if <результат ввода>==None: мне кажется более читаемой, чем просто if <результат ввода>

Тем более, что если рассмотреть задачу, которая стоит перед сетевым администратором, изображенную на втором рисунке, то станет понятно, что выигрыш в милисекунду (что очень много для кода) — ничто для сетевого протокола.

Используется же питон 2.7
Ребят, очень и очень плохой код, стиль и вообще всё. От ==None: до Except:, который перехватит вообще всё, включая RuntimeError и KeyboardInterrupt.
Насчет стиля я уже ответил, а вот по-поводу Except — и пусть перехватывает. Гораздо лучше, если при наборе
f=os.open('/mnt/sd1/s.s',os.O_CREAT|os.O_RDWR);print f
в случае, если ты ошибешься и assistant не вылетит, и его не нужно будет переустанавливать.
Это во-первых «программа-зубочистка», то есть одноразовая, во-вторых ее цель показать использование средств os в качестве API.

Хотелось бы обратить внимание на то, что питон работает на маршрутизаторе. на домашней мыльнице, например или на чем-то более крупном. Вы серьезно считаете, что кривой код прикладной программы, влияет на возможности самой технологии?

It is not pythonic way.


Ну хотя бы так:


import os
import sys  # не стоит сливать импорты

def run(c):
    b = c.split()

    if b[0] == 'ls':
        if len(b) == 1:  # if b.__len__() == 1:
            b.append('/');
        res = os.listdir(b[1])
        print(res)
    else:
        try:
            exec(c)  # выполнять любой код?
            return 1  # зачем возвращаемое значение?
        except:
            print('Something wrong')
            return 0  # зачем возвращаемое значение?
    # неявный return None (return 0)

def get_command(ops, VTY):
    ops.terminal.write('>>>',vty = VTY)  # a, b = ... - лишнее
    a, _ = ops.terminal.read(maxLen = 200,timeout = 60,vty=VTY)  # _ - тоже переменная
    # if a == None:
    #     a = 'q';
    return a or 'q'  # a or 'q' <=> если a == None, то будет возвращено 'q'

def ops_condition(ops):
    '''Ставим ловушку на ввод команды sh'''
    # value, err_str - лишние
    ops.cli.subscribe('cli1', '^sh$', enter=True, sync=True, sync_wait=500)
    return 0  # зачем?

def ops_execute (ops):
    '''Собственно, сам shell'''
    key, _ = ops.environment.get('_cli_vty')  # value не использовалась

    while True:  # 2<3 ???
        command = get_command(ops, key)
        if command == 'q':
            break  # не нужно ';'
        if command:  # не нужно писать if command != '':
            run(command)
            continue
    print('\nexit\n')
    return 0  # зачем?

Лучше обернуть код в класс.

спасибо за конструктивную критику. отвечу на некоторые вопросы

while True: vs while 2<3
конечно я сначала использовал именно эту конструкцию, но интерпретатор ругался на ошибку в строке. после нескольких попыток я плюнул и использовал более корявый, но работающий механизм. Это не является оправданием кривости кода. Но у меня была задача заставить маршрутизатор писать в файл. документация по API по этому поводу ничего не говорила, поэтому я собрал этот код на коленке исключительно для выяснения того, какие системные модули используются и можно ли писать в файл и читать из него. Да, разумеется, о питоне до этого я ничего не знал, как, впрочем и сейчас.

зачем return 0 в ops_execute и ops_condition. Это, конечно, копипаста из документации по API.
зачем return 0 в других функциях — затрудняюсь ответить.

while True: vs while 2<3: — Это странно, вероятно, ошибка была в другом. Можно и while 1.


return — В месте вызова функции run возвращаемое значение не ожидается, return — лишнее.
Функция может заканчиваться инструкцией return или не иметь её (при этом вернет None). Следующие функции эквивалентны, все вернут None:


def foo():
    return None

def foo():
    return

def foo():
    pass  # ничего не выполняет

В последнем случае инструкция pass ничего не выполняет, просто синтаксис требует тело функции, поэтому тут только неявный return None.


В функции run 3 сценария:
a) условие истинно, тогда вернётся None;
b) условие ложно, нет исключения, тогда вернётся 1;
c) условие ложно, есть исключение, тогда вернётся 0.
Если возвращаемое значение рассматривать как булево, то как-то нелогично, т.к. только b) даст True.

Sign up to leave a comment.