Python и отступы, возникают проблемы с началом работы. - PullRequest
2 голосов
/ 05 октября 2009

Я только начал изучать Python и меня поймали. Я родом из C-фона.

class Alarm:

    def timer():

    def main():
        print ("Timer has Started")

    main()

Я всегда получаю глупую ошибку при попытке запустить этот код:

alarm > python alarm.py 
  File "alarm.py", line 5
    def main():
      ^
IndentationError: expected an indented block

Ответы [ 9 ]

11 голосов
/ 05 октября 2009

У вас есть пустой def

def timer():

, используйте

def timer():
    pass

вместо.

3 голосов
/ 05 октября 2009

Узнайте о pass утверждении , main обычно не является частью класса.

Глобальная (на уровне модуля) функция main() проще, чем метод класса Alarm.main(). Обычно main() функции приходят на уровне модуля.

class Alarm:

    def timer():
        pass

def main():
    print ("Timer has Started")

main()
1 голос
/ 05 октября 2009

Вызов main () выдаст неопределенную ошибку функции , так как это метод Alarm.

ИМХО правильная форма, которую вы должны использовать, следующая:

class Alarm:
    def timer():
      pass

    @staticmethod
    def main():
      print ("Timer has Started")

if __name__ == "__main__" :
    Alarm.main()
1 голос
/ 05 октября 2009

Я думаю, что вы хотите использовать __init__, хотя, это конструктор ...

class Alarm:

    def timer(self): 
        print('timer has started')

    def __init__(self): 
        print('constructor')
        self.timer()


x = Alarm()

Конструктор

таймер запущен

Мой пример отличается от других тем, что я на самом деле создаю новый объект.

Примечания:

  • укажите self в качестве первого аргумента для любого метода, определенного в классе
  • __init__ - это метод определения для конструктора
  • вызовите класс с помощью variableName = className (), как если бы вы вызывали функцию, без new ключевого слова
  • если у вас пустая функция, используйте ключевое слово pass, например def foo(self): pass
1 голос
/ 05 октября 2009

Ваша функция таймера не определена. (И ваш отступ пробела / табуляции может быть смешанным)

См. Учебник ( классы ) для получения более подробной информации о классах.

class Alarm:

    def timer(self):
        pass
    def main(self):
        print ("Timer has Started")

if __name__ == '__main__':
    class_inst = Alarm()
    class_inst.main()

Если вы попадаете в python, прочитайте PEP8 .
Кроме того, с помощью подсказки pylint он укажет на отступ и многие другие ошибки, с которыми вы столкнетесь, прежде чем «выполнить» свой код.

1 голос
/ 05 октября 2009

попробуйте deindent main (), добавьте pass в timer и определите метод init:

class Alarm():

    def __init__(self):
        print ("Timer has Started")

<shell>$  Alarm()
0 голосов
/ 05 октября 2009

Спасибо всем за помощь. Я делал небольшой будильник / таймер, чтобы напоминать мне встать и прогуляться время от времени. Я получил большую часть работы, и она прекрасно работает. Проверил это по секундомеру, и он прекрасно работает.

import time

def timer(num):
    seconds = num*60
    print (num , "minutes", seconds , "seconds")

    while (seconds > 0):
        print (seconds, "seconds")
        time.sleep(1)
        seconds = seconds-1

    print ("Time to get up and take a WALK!!!!")
    main()


def main():
    number = input("Input time : ")
    int(number)
    timer(number)


if __name__ == '__main__':
    main()
0 голосов
/ 05 октября 2009

В Python вам не нужно определять все как класс. В этом коде нечего инкапсулировать, поэтому нет причин определять класс Alarm. Просто имейте функции в модуле.

0 голосов
/ 05 октября 2009

Как уже отмечали другие, у вас есть синтаксическая ошибка, потому что timer () не имеет тела.

Вам вообще не нужно использовать main () в python. Обычно люди используют его, чтобы указать, что файл является программой верхнего уровня, а не модулем для импорта, но это просто по соглашению

Вы также можете увидеть эту идиому

def main():
    blah blah

if __name__ == "__main__":
    main()

Здесь __name__ - специальная переменная. Если файл был импортирован, он будет содержать имя модуля, поэтому сравнение не удастся и main не запустится.

Для программы верхнего уровня __name__ содержит "__main__", поэтому будет запущена функция main ().

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...