为什么我不能将可选的参数默认为成员变量?

时间:2015-09-25 09:13:07

标签: python python-2.7 methods self

我有一个方法get_annotated_pkt_msg(),它接受​​一个布尔参数show_timestamp。我希望这是一个可选参数,因此如果调用者没有指定参数,它将默认为用户定义的配置中设置的参数。此配置存储在容器self.config中,该容器已通过构造函数依赖注入传递:

class XcpDaqFrame(XcpFrame):

    def __init__(self, *args, **kwargs):
        # Pass init arguments to super-class.
        super(XcpDaqFrame, self).__init__(*args, **kwargs)
        # Passed by dependency injection to this constructor.
        self.config = config

    def get_annotated_pkt_msg(
            self,
            show_timestamp=self.config.getConfigItem('display.packet_time')):
        ##### SyntaxError here ^ (on the dot after 'self') ########
        """Return the annotated packet message

        :param bool show_timestamp:
        :rtype: str
        """
        # Optionally, show the timestamp of the packet.
        if show_timestamp:
            timestamp = get_timestamp()
            timestamp_msg = u", Timestamp: {} μs".format(timestamp)
        else:
            timestamp_msg = ""
        return timestamp_msg

frame = XcpDaqFrame(my_config)
frame.get_annotated_pkt_msg()

如果我尝试上述内容,请在上面标记的行上告诉我:

  

SyntaxError:语法无效

为什么我可以将self传递给方法,但无法传递它们self.config

1 个答案:

答案 0 :(得分:3)

函数的默认参数在定义函数时计算,而不是在调用函数时计算,因此在定义函数时(self没有值),并且不能将其他参数用于同一函数在默认参数中。这也会导致其他问题,比如 mutable default argument (了解更多关于here的信息)。

除此之外,您可以尝试使用其他一些默认值(例如None)左右,然后将其默认为self.config.getConfigItem('display.packet_time'),如果是None。示例 -

def get_annotated_pkt_msg(
        self,
        show_timestamp=None):
    ##### SyntaxError here ^ (on the dot after 'self') ########
    """Return the annotated packet message

    :param bool show_timestamp:
    :rtype: str
    """
    if show_timestamp is None:
        show_timestamp = self.config.getConfigItem('display.packet_time')
    # Optionally, show the timestamp of the packet.
    ... #Rest of the logic