2014-10-08 5 views
-1

Прежде чем начать, есть много других точных вопросов, но ни один из ответов не подходит для моей проблемы. Класс/функции log.info('foo') выполняется один раз без проблем, однако второй раз он назвал его получить ошибку TypeError: 'str' object is not callableTypeError: объект 'str' не может быть вызван. Хотя ничего не называется «str»

Я обнаружил, что this question имеет те же проблемы, как и я, но у меня нет ничего под названием ул. Я тестировал с другими функциями, то есть войной.

Мой код:

import praw 
import sys 
import traceback 
from accounts import * 

class logging: 

    def info(self, log): 
     self.info = '\033[94m' 
     self.rs = '\033[0m' 
     print self.info, 'INFO: ', self.rs 

    def warn(self, log): 
     self.warn = '\033[93m' 
     self.rs = '\033[0m' 
     print self.warn, 'WARNING: ', self.log, self.rs 

    def critical(self, log): 
     self.critical = '\033[91m' 
     self.rs = '\033[0m' 
     print self.critical, 'CRITICAL: ', log, self.rs 

def read_accounts(): 
    with open('accounts.py') as f: 
     for i, l in enumerate(f): 
      pass 

    i += 1 
    accounts = {} 

    while i > 0: 
     ac = globals()['account_%s' %i] 
     index = ac.find(':') 
     uname = ac[0:index] 
     password = ac[index+1:len(ac)] 
     accounts[uname] = password 
     i -= 1 

    log.info('Usernames loaded successfully! Usernames loaded:') 
    print accounts 

def main(): 
    log.info('Initilizing reddit accounts from file...') 
    try: 
     read_accounts() 
    except: 
     traceback.print_exc() 
     log.critical('Can not read accounts! Make sure format is correct!') 
     sys.exit() 


if __name__ == '__main__': 
    log = logging() 
    main() 

Кроме того, я знаю, что есть модуль регистрации в питона, но я хотел бы сделать свое дело!

Заранее благодарен!

+0

У вас есть переменная уровня модуля с именем 'log' в вашем модуле' accounts'? – nofinator

ответ

4

Проблема заключается в том, что ваш logging класс переопределяет все его методы, например, как строки:

class logging: 

    def info(self, log): 
     self.info = '\033[94m' # self.info is not a function anymore 
     self.rs = '\033[0m' 
     print self.info, 'INFO: ', self.rs 

Так первый раз, когда вы звоните log.info, она вызывает функцию info. Во второй раз он пытается вызвать строку '\033[94m'.

Просто используйте другое имя для этой переменной экземпляра во всех своих методах - или не делайте его переменной экземпляра вообще. Вы пересматриваете его каждый раз, когда метод вызывается в любом случае:

class logging: 

    def info(self, log): 
     info_prefix = '\033[94m' # no conflict 
     self.rs = '\033[0m' 
     print info_prefix, 'INFO: ', self.rs 
+0

Спасибо! Это потрясающе! – George

Смежные вопросы