)]}'
{"ceilometerclient/v2/shell.py":[{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"f92bd44375549117c302db5bc8581f4701c667aa","unresolved":false,"context_lines":[{"line_number":146,"context_line":""},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"def _restore_shadowed_arg(shadowed, observed):"},{"line_number":149,"context_line":"    def wrapper(func):"},{"line_number":150,"context_line":"        @functools.wraps(func)"},{"line_number":151,"context_line":"        def wrapped(cc, args):"},{"line_number":152,"context_line":"            v \u003d getattr(args, observed, None)"}],"source_content_type":"text/x-python","patch_set":4,"id":"da86d52c_9f060bcd","line":149,"updated":"2015-02-10 21:08:28.000000000","message":"sort of confused... why do we need 3 levels can we dropped the \u0027def wrapper(func):\u0027 level?","commit_id":"7777c0db6e0464a793c1bb4894dfd98aed93e92b"},{"author":{"_account_id":6676,"name":"zqfan","email":"aji.zqfan@gmail.com","username":"aji-zqfan"},"change_message_id":"286a85be8192372e292e10653a0e8377bd9e204d","unresolved":false,"context_lines":[{"line_number":146,"context_line":""},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"def _restore_shadowed_arg(shadowed, observed):"},{"line_number":149,"context_line":"    def wrapper(func):"},{"line_number":150,"context_line":"        @functools.wraps(func)"},{"line_number":151,"context_line":"        def wrapped(cc, args):"},{"line_number":152,"context_line":"            v \u003d getattr(args, observed, None)"}],"source_content_type":"text/x-python","patch_set":4,"id":"da86d52c_9870dc41","line":149,"in_reply_to":"da86d52c_9f060bcd","updated":"2015-02-11 01:45:34.000000000","message":"I don\u0027t know where to store the argument `func`, so I did this\n\nfunctool.wraps should be used otherwise the decorated function\u0027s name and docstring will be changed","commit_id":"7777c0db6e0464a793c1bb4894dfd98aed93e92b"}]}
