Python: ожидается блок с отступом - PullRequest
0 голосов
/ 17 сентября 2018

Я пытаюсь запустить 2 программы на Python с помощью mapreduce и постоянно получаю сообщение об ошибке, когда запускаю их.Ниже приведен код для 2 файлов.Он постоянно говорит мне, что в основной программе (sys.argv) в обеих программах ожидается ошибка с отступом блока.Любые рекомендации приветствуются.

Mapper.py

#!/usr/bin/env python
#Be sure the indentation is identical and also be sure the line above this is on the first line

import sys
import re

def main(argv):
    line = sys.stdin.readline()
    pattern = re.compile("[a-zA-Z0-9]+")
    while line:
        for word in pattern.findall(line):
            print(word+"\t"+"1")
    line = sys.stdin.readline()
#Note there are two underscores around name and main
    if __name__ == "__main__":
        main(sys.argv)

reducer.py

#!/usr/bin/env python
#Be sure the indentation is correct and also be sure the line above this is on the first line

import sys

def main(argv):
    current_word = None
    current_count = 0
    word = None
    for line in sys.stdin:
        line = line.strip()
        word, count = line.split('\t', 1)
        count = int(count)
        if current_word == word:
            current_count += count
        else:
            if current_word:
                print('%s\t%s' % (current_word, current_count))
            current_count = count
            current_word = word
    if current_word == word:
        print('%s\t%s' % (current_word, current_count))

#Note there are two underscores around name and main
    if __name__ == "__main__":
        main(sys.argv)

Сообщение об ошибке:

[maria_dev@sandbox-hdp ~]$ python reducer.py                                                                                                                                                                       
  File "reducer.py", line 25
    main(sys.argv)                                                                                                                                                                                                 
       ^                                                                                                                                                                                                           
IndentationError: expected an indented block

ПримерФайл картографа Mapper.py

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

Вы должны использовать блок if __name__ == "__main__": вне функции main.

0 голосов
/ 17 сентября 2018
if __name__ == "__main__":
    # some
    # commands
    # doing
    # stuff

Это хороший маленький трюк в Python, который используется при написании библиотек.Когда вы import библиотека, вы обычно просто хотите импортировать классы и функции, но не хотите выполнять пример кода.Это отличается, когда вы выполняете файл библиотеки как отдельный скрипт.Когда вы сделаете это, вы ожидаете получить несколько примеров использования этой библиотеки.В Python это достигается с помощью if __name__ == "__main__":.__name__ - это переменная, содержащая строку, специфичную для текущего файла.Для основного файла эта строка всегда имеет значение "__main__", так что это простой способ определить, является ли файл основным файлом или просто какой-то библиотекой.

Основная проблема - отступ.Python может сообщать блоки логического кода (например, определения функций, тела if-предложений или циклы) с помощью отступа.Если Python сообщает вам, что есть IndentationError, то причиной этого, вероятно, является неформатный код.Эта ошибка также может возникать, если вы смешиваете табуляции и пробелы, поэтому будьте осторожны, чтобы избежать этого.Золотой стандарт имеет отступ от 4 пробелов, а не табуляции.

Кроме того, использование if __name__ == "__main__": почти никогда не имеет смысла в контексте с отступом.Достаточно безопасно либо полностью удалить этот блок (если вы когда-либо используете эти файлы в качестве библиотек), либо удалить его, чтобы if был полностью удален, а тело предложения if имеет 4 пробела.

...