Pycharm:无法设置属性

时间:2018-12-05 09:58:52

标签: python

我正在尝试覆盖flask_jsonrpc的格式化程序方法:

from flask_jsonrpc import exceptions

def override_jsonrpc_error_formatter(app):
    @property
    def json_rpc_format(self):
        return ErrorFormatter.format_error(self)

    exceptions.Error.json_rpc_format = json_rpc_format
然后会在另一个文件中调用

override_jsonrpc_error_formatter 函数。

一切正常,但是pycharm向我显示了最后一个字符串的警告,说:“无法设置属性json_rpc_format”。为什么会这样呢?我需要以其他方式覆盖它吗?

2 个答案:

答案 0 :(得分:0)

您需要阅读有关setters

的信息

在这种情况下,我会做类似的事情:

class CustomError(Error):

    @property
    def json_rpc_format(self):
        return self._json_rpc_format

    @json_rpc_format.setter
    def json_rpc_format(self, value):
        self._json_rpc_format = value

答案 1 :(得分:0)

因此,您可以从flask_jsonrpc包中导入例外。

在包装中,您可以找到these lines

class Error(Exception):
    """Error class based on the JSON-RPC 2.0 specs
    http://groups.google.com/group/json-rpc/web/json-rpc-1-2-proposal
      code    - number
      message - string
      data    - object
      status  - number    from http://groups.google.com/group/json-rpc/web/json-rpc-over-http JSON-RPC over HTTP Errors section
    """

    code = 0
    message = None
    data = None
    status = 200

    def __init__(self, message=None, code=None, data=None):
        """Setup the Exception and overwrite the default message
        """
        super(Error, self).__init__()
        if message is not None:
            self.message = message
        if code is not None:
            self.code = code
        if data is not None:
            self.data = data

    @property
    def json_rpc_format(self):
        """Return the Exception data in a format for JSON-RPC
        """

        error = {
            'name': text_type(self.__class__.__name__),
            'code': self.code,
            'message': '{0}'.format(text_type(self.message)),
            'data': self.data
        }

        if current_app.config['DEBUG']:
            import sys, traceback
            error['stack'] = traceback.format_exc()
            error['executable'] = sys.executable

        return error

因此,基本上,您正在尝试从flask_jsonrpc包覆盖Error类的属性,这是不允许的,因为这是不可设置的属性。

如果您想覆盖它,我认为您应该使用其他类从它继承,并直接将其导入或将其连接回模块。

例如:

class myCustomError(exceptions.Error):
    @property 
    def json_rpc_format(self):
        return do_some_custom_logic_here()