为什么我不能将可选参数默认为成员变量?
Why can't I make an optional paremeter default to member variable?
我有一个方法 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: invalid syntax
为什么我可以将 self
传递给方法,但不能将它们传递给方法 self.config
?
函数的默认参数是在定义函数时计算的,而不是在函数被调用时计算的,所以在定义函数时(自身没有值),你不能将其他参数用于默认参数中的相同功能。这也会导致其他问题,例如 可变默认参数 (阅读更多有关 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
我有一个方法 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: invalid syntax
为什么我可以将 self
传递给方法,但不能将它们传递给方法 self.config
?
函数的默认参数是在定义函数时计算的,而不是在函数被调用时计算的,所以在定义函数时(自身没有值),你不能将其他参数用于默认参数中的相同功能。这也会导致其他问题,例如 可变默认参数 (阅读更多有关 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