我想要一个可配置的python可调用。类与函数工厂?

问题描述 投票:1回答:1

我想编写许多相关的解析函数,这些函数接受文本并返回对象或引发异常,就像int()和float()一样。我确实希望能够将这些递归提供给更高级别的解析器。我希望能够在运行时进行配置,并且可以设置它们的文档字符串或其他属性来报告它们的配置方式。]

Python的“应该有一个-最好只有一个-显而易见的方法”已经让我失望了。

我似乎能够对具有调用方法的类或返回函数的函数执行完全相同的操作。

例如,下面是我两次尝试玩具范围受限制的数字解析器。

class Parser():
    def __init__(self, nType=int, nRange=None):
        self.nType = nType
        self.nRange = nRange
        self.__doc__ = 'class - range is {}'.format(str(nRange))

    def __call__(self, inStr):
        x = self.nType(inStr)
        if self.nRange:
            if not self.nRange[0] <= x <= self.nRange[1]:
                raise ValueError('{} is out of range (class)'.format(inStr))
        return x        

def parserFactory(nType=int, nRange=None):
    def parser(inStr):
        x = nType(inStr)
        if nRange:
            if not nRange[0] <= x <= nRange[1]:
                raise ValueError('{} is out of range (factory)'.format(inStr))
        return x
    parser.__doc__ = 'factory - range is {}'.format(str(nRange))
    return parser    

a = Parser()
b = Parser(nRange=(3,6), nType=float)
c = parserFactory(nType=float)
d = parserFactory(nRange=(3, 6))

for string in ['4', '14']:
    for x in [a,b,c,d,int]:
        print(x.__doc__[:35])
        try:
            print(string, x(string))
        except ValueError as error:
            print(error)

我都想做。两者具有或多或少相同的复杂性,并且本质上是相同的语句,尽管顺序不同。工厂略短一些。我预计不需要使用任何其他类方法。我看不出任何明确的方法来选择哪个更好。

是另一个还是另一个pythonic?

如果(当我)尝试以一种未曾预料的方式修改它们时,一个或另一个会更容易使我陷入困境吗?

大多数人做什么?

我是一位经验不足的程序员。我读过维基百科关于“工厂方法模式”的条目,其中的微妙之处直指我的脑袋。

((edit))阅读评论,答案和链接后,我认为问题之一是两者都不适合。即使可以,一个类也不会有这么少的方法。即使功能可以携带属性,您也不希望它带有属性。由于语法非常相似,因此我最初使用哪种语法都可能无关紧要,因为我可以在不改变行为的情况下进行切换。 (/编辑)

我想编写许多相关的解析函数,这些函数接受文本并返回对象或引发异常,就像int()和float()一样。我确实希望能够将这些递归提供给...

python class factory
1个回答
0
投票
对于只有__init____call__的类,

您可以将函数视为语法糖

© www.soinside.com 2019 - 2024. All rights reserved.