Функция проверки регулярных выражений. Визуализация кода - PullRequest
0 голосов
/ 07 апреля 2020

У меня есть следующий код:

from sys import stdin
import re

def main():
    def hidden1_test(): return hidden1('test')
    def hidden2_test(): return hidden2('test')
    tasks = [dna, sorted, hidden1_test, hidden2_test, equation, parentheses, sorted3]
    print('Skriv in teststrängar:')
    while True:
        line = stdin.readline().rstrip('\r\n')
        if line == '': break
        for task in tasks:
            result = '' if re.search(task(), line) else 'INTE '
            print('%s(): "%s" matchar %suttrycket "%s"' % (task.__name__, line, result, task()))

if __name__ == '__main__': main()

Функции в списке задач определены выше, но они не важны для моего вопроса. Я понимаю весь запуск функции main вплоть до последних двух строк:

result = '' if re.search(task(), line) else 'INTE '    
print('%s(): "%s" matchar %suttrycket "%s"' % (task.__name__, line, result, task()))

Я не понимаю, что означает task.__name__. Имя должно быть __name__ == '__main__', поэтому я предполагаю, что мой вопрос становится тем, что означает task.'__main__' (поправьте меня, если я ошибаюсь)? Я интерпретирую первую строку из двух приведенных выше как:

result = '' 
if re.search(task(), line): 
else:
    'INTE '

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

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 07 апреля 2020

Итак, у вас есть список задач.

tasks = [dna, sorted, hidden1_test, hidden2_test, equation, parentheses, sorted3]

Вы не знаете, когда эти задачи закончатся, поэтому продолжайте проверять, пока они не будут завершены: while True:

Чтобы знать который еще работает, вы читаете строку из стандартного ввода.

line = stdin.readline().rstrip('\r\n')

см .: python 3.8.2, stdin

Если все задачи Закончив, вам нечего читать, вы прерываете время l oop и завершаете программу.

if line == '': break

# same as
if line == '':
  break

В информационных целях мы хотим напечатать, какие задачи еще выполняются, а какие были INTE нарушено.

Эта задача все еще выполняется (имя задачи найдено в line)?

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

re.search(pattern, text) # Return true if it found something!

Поиграйте с RegExr , вы увидите, что это довольно круто.

Тогда, если задача не найденный (он закончен), мы добавляем INTE, чтобы обозначить, что он был прерван.

result = '' if re.search(task(), line) else 'INTE '

# Above is a ternary operator, which is the same as...
if re.search(task(), line) :
  result = ''
else:
  result = 'INTE'

Здесь мы используем то, что большинство людей называют троичным оператором * 103 7 *.

... и затем мы печатаем текст. task.__name__ - это просто название задачи. Скорее всего, ваш task является объектом, и у этого объекта есть имя. Можно предположить, что имя вашей задачи может быть dna, sorted, hidden1_test, ...

1 голос
/ 07 апреля 2020

Здесь есть несколько вопросов.

Что такое __name__?

В Python, __name__ - это специальный атрибут, автоматически создаваемый для некоторых типов конструкций, таких как модули, классы , функции, и т. д. c. (см. Python Модель данных для получения более подробной информации)

В вашем коде он используется дважды:

  • task.__name__ будет имя того, что task представляет. Я думаю, это будет функция в вашем коде.

    Например, для задачи hidden1_test, task.__name__ будет 'hidden1_test'.

  • if __name__ == '__main__': main() является классическим c способом в Python, чтобы определить, является ли текущий скрипт программой main Python.

    Здесь __name__ - имя текущего модуля , Если оно равно значению '__main__', то это означает, что текущий скрипт является основной программой.

    Более подробную информацию об этом можно найти в Что делать, если __name__ == "__main__": do?

Как работает result = 'A' if matches else 'B'?

Это условное выражение , также известный как троичный оператор .

На большинстве языков, вдохновленных C, тот же код будет написан result = matches ? 'A' : 'B'.

Если возвращаемое значение re.search(task(), line) равно истинно , переменной result будет присвоено значение ''. Если нет, ему будет присвоено значение 'INTE '.

...