python - 间隔符号?

标签 python

我想为实数区间创建一个 Python 类。与数学符号最密切相关的语法是 Interval([a, b))或者,更好的是,Interval[a, b)构造所有实数的区间x满意a <= x < b .

是否可以构造一个类来处理这种语法?

最佳答案

不可能通过创建自定义类来“修复”语法无效的 python。

我认为在 python 中最接近数学区间符号的是

Interval('[a, b)')

如果您将区间作为参数传递给函数并且函数在使用它们之前将其参数转换为适当的类型,则这种方式会变得更加轻量级。示例:

def do_foo(interval, bar, baz):
    interval = Interval(interval)
    # do stuff

do_foo('[3,4)', 42, true)

Possible implementation :

import re

class Interval:
    def __init__(self, interval):
        """Initialize an Interval object from a string representation of an interval
           e.g: Interval('(3,4]')"""
        if isinstance(interval, Interval):
            self.begin, self.end = interval.begin, interval.end
            self.begin_included = interval.begin_included
            self.end_included = interval.end_included
            return
        number_re = '-?[0-9]+(?:.[0-9]+)?'
        interval_re = ('^\s*'
                       +'(\[|\()'  # opeing brecket
                       + '\s*'
                       + '(' + number_re + ')'  # beginning of the interval
                       + '\s*,\s*'
                       + '(' + number_re + ')'  # end of the interval
                       + '\s*'
                       + '(\]|\))'  # closing brecket
                       + '\s*$'
                      )
        match = re.search(interval_re, interval)
        if match is None:
            raise ValueError('Got an incorrect string representation of an interval: {!r}'. format(interval))
        opening_brecket, begin, end, closing_brecket = match.groups()
        self.begin, self.end = float(begin), float(end)
        if self.begin >= self.end:
            raise ValueError("Interval's begin shoud be smaller than it's end")
        self.begin_included = opening_brecket == '['
        self.end_included = closing_brecket == ']'
        # It might have been batter to use number_re = '.*' and catch exeptions float() raises instead

    def __repr__(self):
        return 'Interval({!r})'.format(str(self))

    def __str__(self):
        opening_breacket = '[' if self.begin_included else '('
        closing_breacket = ']' if self.end_included else ')'
        return '{}{}, {}{}'.format(opening_breacket, self.begin, self.end, closing_breacket)

    def __contains__(self, number):
        if self.begin < number < self.end:
            return True
        if number == self.begin:
            return self.begin_included
        if number == self.end:
            return self.end_included

关于python - 间隔符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39644748/

相关文章:

python - 如何计算输出文件(写入 txt 文件的字符串列表)中的字母 N?

python - 序数替换

python - PYTHONPATH 如何填充 sys.path 是否可靠并记录在案?

python - 将卡住图从 .pb 转换为 .onnx

python - 匹配 2 个数据帧之间的值并使用用户定义的函数进行更新

python - 如何使用 python 获取给定 url 的原始 html 文本

python - 将项目添加到标准 QWebView 上下文菜单

python - 脆皮表格和 bootstrap 3 没有显示错误消息

python - 如何使用参数别名在 python 中实现弃用

python - 在 Python 中刷新套接字