Comments 17
«»
вместо ""
. Код уже не скопипастить, надо ещё каким-нибудь 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).
return a or 'q'
Она ориентирована не на программистов, а на сетевых администраторов.
Много вы встречали документации на TCL и, прежде всего, его API, когда его только встроили в Cisco?
Тот факт, что переменные не анализируются, говорит о том, что из кода убраны проверки, для уменьшения размера кода. Про конструкцию «a, _» согласен, нужно было бы заменить.
Тут дело в том, что совершенно очевидно, что человек, писавший код, даже не прочитал Python Tutorial. То есть, просто взял скопипастил вместе какие-то куски кода, нарушая все писаные и неписанные стандарты кода на Python. Такого кода в мире очень много, я это знаю, так как регулярно с ним встречаюсь всю жизнь. И эти костыли кое-как в идеальных условиях иногда даже работают.
Но данный подход всегда приводит к проблемам. Этот отвратительный код всегда невозможно поддерживать. Вы в скрипте из 5-10 строчек наделали ошибок практически в каждой строчке. Когда ваш код вырастет до сотен и тысяч строк, это будет прост клубок костылей, скрепленный резинками и скотчем. И малейшие изменения или исправления будут выливаться в огромную головную боль.
Да, хорошо сказать: «этот код не вызывает синтаксических ошибок интерпретатора и вроде как работает, я умываю руки». Но такой подход никогда не бывает масштабируемым.
И вообще, неужели так сложно час потратить на чтение хотя бы Python Tutorial, входящего в состав любого дистрибутива Python? Быстрее надо лес рубить, некогда топор точить?
Статья сильно отредактирована, видимо в процессе редактирования у кого-то редактор заменил кавычки '' на «», так же убраны мои извинения за корявость кода и прежде всего за конструкцию while 2<3:, ну а конструкция if <результат ввода>==None: мне кажется более читаемой, чем просто if <результат ввода>
Тем более, что если рассмотреть задачу, которая стоит перед сетевым администратором, изображенную на втором рисунке, то станет понятно, что выигрыш в милисекунду (что очень много для кода) — ничто для сетевого протокола.
Используется же питон 2.7
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
.
И снова автоматизация: Python «дополз» до маршрутизаторов