2017-06-02 8 views
0

固定与えられました。ここにレポをチェック - lilydjwgのヘルプ)は8つの位置引数を取りますが、11は

ソースコードpython-redis-log

logger.py source code

handlers.py source codeためhttps://github.com/plantpark/python-redis-log感謝を

python-redis-logには何も存在しないようです1つは維持する。今はpython3.5と互換性がありません。 Python3.5に移行したい。ここでの質問は:

私は以下のコードを実行します。 "makeRecord()は8個の位置引数を取るが、11個は与えられた"というTypeErrorを返す。

# redis_log.py the same directory with handlers.py and logger.py 
import handlers, logger 
l = logger.RedisLogger('my.logger') 
l.addHandler(handlers.RedisHandler.to("my:channel", host='localhost', port=6379, password='foobie')) 
l.info("I like pie") 

エラー:エラーが報告したように

Traceback (most recent call last): 
    File "redis_log.py", line 6, in <module> 
    l.error("I like pie") 
    File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/logging/__init__.py", line 1309, in error 
    self._log(ERROR, msg, args, **kwargs) 
    File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/logging/__init__.py", line 1415, in _log 
    exc_info, func, extra, sinfo) 
TypeError: makeRecord() takes 8 positional arguments but 11 were given 

、11個の位置の引数が指定されました。コードを何度もチェックしたところ、以下のコードに何か問題があったと思いました。しかし、私がユーザー名や名前などのいくつかのキーと値をコメントするとき、それを9つの引数にとどめました。エラーは同じでした。だから...バグはどこにありますか?それを見つけて修正する方法は?

# https://github.com/jedp/python-redis-log/blob/master/redislog/logger.py 
# python-redis-log logger.py line 71 
    self._raw = { 
     #'name': name, 
     'level': levelAsString(lvl), 
     'filename': fn, 
     'line_no': self.lineno, 
     'msg': str(msg), 
     'args': list(args), 
     'time': datetime.datetime.utcnow(), 
     'funcname': self.funcname, 
     #'username': self.username, 
     'hostname': self.hostname, 
     'traceback': exc_info 
    } 
+0

あなたが投稿したコードに 'makeRecord'がどこにあるのかわかりません – doctorlove

+0

@doctorloveペーストされたlogger.pyとhandlers.pyはここに直接リンクしています。もう一度チェックしてください。ありがとう! –

答えて

2

私は実際にPython 3.6でこれを取得します。

Traceback (most recent call last): 
    File "redis_log.py", line 4, in <module> 
    l.info("I like pie") 
    File "/usr/lib/python3.6/logging/__init__.py", line 1306, in info 
    self._log(INFO, msg, args, **kwargs) 
    File "/usr/lib/python3.6/logging/__init__.py", line 1441, in _log 
    exc_info, func, extra, sinfo) 
TypeError: makeRecord() takes from 8 to 10 positional arguments but 11 were given 

あなたの定義:あなたが数えることができたよう

def makeRecord(self, name, lvl, fn, lno, msg, args, exc_info, func=None, extra=None): 

は、11個の引数は、そのうちの二つはデフォルト値があり、そこにあります。

l.infoとは何ですか?トレースバックとして、self._logが呼び出されます。

def _log(self, level, msg, args, exc_info=None, extra=None, stack_info=False): 
    # ... 
    record = self.makeRecord(self.name, level, fn, lno, msg, args, 
          exc_info, func, extra, sinfo) 

これはあなたのmakeRecordは(ロギングモジュールによって)呼び出される場合:コードは次のようです。それらを数える。 10をかっこで囲み、1つは暗黙的に渡されます。これはメソッド呼び出し(self arg)です。

あなたは最後のものを逃しました。あなたは、引数を渡しているので、あなたは、より良い、それは次のように拡張可能にするだろう:

def makeRecord(self, name, lvl, fn, lno, msg, args, exc_info, *args, **extra): 
    record = RedisLogRecord(name, lvl, fn, lno, msg, args, exc_info, *args, **extra) 

はまた、あなたのコードは関係なく、あなたの引数funcのコンストラクタにfunc=Noneを渡すことに注意してください。

RedisLogRecordには、self._rawディクールに**extraを、self._raw.update(extra)に渡すことができます。位置argsの場合は、それに応じて処理する必要があります。

関連する問題