在ruamel.yaml中获取布尔值的行号

如何解决在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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?