运算符上的 Python 模式匹配

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

我正在尝试构建一个与运算符匹配的函数,例如

-

def testM(x):
    match x:
        case (operator.sub,a,b):
            return operator.sub(a,b)
        case ('-',a, b):
            return a-b
        case ("+",a,b):
            return a+b
        case ("other strange op",a,b,c):
            return (a+b-c)
        .......
        case _ : 
            return 0

该函数将在jupyter中使用,因此用户会经常键入它。我希望尽可能减少击键次数

testM('-',5,1)  ## 3 key strokes
# it works and return 4 

testM((operator.sub,4,1))   ## 12 key strokes
# it works and return 3

目标是,用户可以这样称呼它,但它不起作用。

testM(-,5,1)  ## only 1 key strokes
# it return 4 

有没有办法逃避参数中

-
的评估?那么 python 不会引发错误?

python pattern-matching literals
1个回答
0
投票

我不确定模式匹配是正确的方法。您只需检查运算符的类型并返回所需的操作即可。检查可调用和字符串的示例:

from simpleeval import simple_eval
from functools import reduce

def testM(*x):
    if callable(x[0]):
        return reduce(x[0], x[1:])
    else:
        return simple_eval(x[0].join(map(str, x[1:])))

输出:

print(testM('-', 5, 2))                #3
print(testM('+', 5, 2, 4))             #11
print(testM(operator.add, 5, 2, 4))    #11
© www.soinside.com 2019 - 2024. All rights reserved.