如何解决在ruamel.yaml中获取布尔值的行号
在此post中,我按照您的建议获取了字符串的行号。像魅力一样工作。然后建议使用类似的模式来获取布尔值和整数的行号。因此,我尝试了几件事,最后使它适用于bool,但是我必须在ruamel.yaml源代码中编辑1行才能使其正常工作。我的问题是,这是实现布尔值行号的正确方法吗?还是有一种无需修改ruamel源代码的方法?
这是我必须在构造函数中更改的ruamel中的一行。py:不要将转换/查找回本机布尔,而是返回包含行号的重载ScalarBoolean:
@("select party from Party party where partyId =:partyId and startDate = '9999-01-01'")
List<Party> findParty(Long partyId);
我确实实现了重载构造函数并处理布尔值的实现(由于我现在不从ruamel源中调用lower(),所以我可能可以摆脱Lower()类方法):
def construct_yaml_bool(self,node):
# type: (Any) -> bool
value = self.construct_scalar(node)
return value # add this
# return self.bool_values[value.lower()]. # remove this
任何建议都将不胜感激。
编辑: 我对您的代码进行了猴子修补,并将重载放入MyConstructor中,但是从未在MyConstructor内部调用contruct_yaml_bool。被调用construct_scalar,但从未调用construct_yaml_bool。
这是我用来设置ruamel.yaml的代码:
import ruamel.yaml
class Boolean(ruamel.yaml.scalarbool.ScalarBoolean):
def __init__(self,value): # constructor
self.__slots__ = ["lc","bool_values","internal_value"]
self.bool_values = []
if value is True:
self.bool_values.append("true")
self.internal_value = True
else:
self.bool_values.append("false")
self.internal_value = False
def lower(self):
if self.internal_value is True:
return "true"
else:
return "false"
class BoolStr(ruamel.yaml.scalarstring.Scalarstring):
__slots__ = "lc"
style = ""
def __new__(cls,value):
return ruamel.yaml.scalarstring.Scalarstring.__new__(cls,value)
# def __init__(self,value): # constructor
# self.__slots__ = "lc"
# self.bool_values = []
# if value is True:
# # self.bool_values.append("true")
# self.internal_value = True
# else:
# # self.bool_values.append("false")
# self.internal_value = False
# def lower(self):
# if self.internal_value is True:
# return "true"
# else:
# return "false"
class Str(ruamel.yaml.scalarstring.Scalarstring):
__slots__ = "lc"
style = ""
def __new__(cls,value)
class MyPreservedScalarstring(ruamel.yaml.scalarstring.PreservedScalarstring):
__slots__ = "lc"
class MyDoubleQuotedScalarstring(ruamel.yaml.scalarstring.DoubleQuotedScalarstring):
__slots__ = "lc"
class MySingleQuotedScalarstring(ruamel.yaml.scalarstring.SingleQuotedScalarstring):
__slots__ = "lc"
class MyConstructor(ruamel.yaml.constructor.roundtripConstructor):
def construct_scalar(self,node):
# type: (Any) -> Any
if not isinstance(node,ruamel.yaml.nodes.ScalarNode):
raise ruamel.yaml.constructor.ConstructorError(
None,None,"expected a scalar node,but found %s" % node.id,node.start_mark
)
if node.style == "|" and isinstance(node.value,ruamel.yaml.compat.text_type):
ret_val = MyPreservedScalarstring(node.value)
elif bool(self._preserve_quotes) and isinstance(node.value,ruamel.yaml.compat.text_type):
if node.style == "'":
ret_val = MySingleQuotedScalarstring(node.value)
elif node.style == '"':
ret_val = MyDoubleQuotedScalarstring(node.value)
elif node.style is None and (node.value == "true" or node.value == "false"):
if node.value == "true":
# ret_val = BoolStr(node.value)
ret_val = Boolean(True)
else:
# ret_val = BoolStr(node.value)
ret_val = Boolean(False)
else:
ret_val = Str(node.value)
else:
ret_val = Str(node.value)
ret_val.lc = ruamel.yaml.comments.LineCol()
ret_val.lc.line = node.start_mark.line + 1
ret_val.lc.col = node.start_mark.column
return ret_val
yaml = YAML()
yaml.preserve_quotes = True
yaml.Constructor = yaml_parser_classes.MyConstructor
with open(full_path_to_file) as fp:
yaml_data = yaml.load(fp)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。