簡體   English   中英

按字符串名稱以編程方式查找運算符

[英]Look up operators programmatically by string name

假設我有以下代碼:

def process(x, y, op):
    if op == 'eq':
        return x == y
    elif op == 'gt':
        return x > y
    elif op == 'lt':
        return x < y
    ... for many more operators, e.g. >=, <=, !=

我怎樣才能以編程方式更好地提煉出來呢? 我正在考慮創建這樣的查找:

op_lookup = {'eq': '==', 'gt': '>', 'lt': '<', ...}

然后做這樣的事情:

def process(x, y, op):
    return x op_lookup[op] y

哪個顯然不是有效的Python ...

eval這樣的東西可能會起作用:

def process(x, y, op):
    return eval('{} {} {}'.format(x, op_lookup[op], y))

在一個例子中產生這個:

>>> process(1, 1, 'eq')
True
>>> process(1, 1, 'lt')
False

是否有更好(更安全?)的方式來實現這一目標?

作為可調用的operator隱藏在operator模塊中。 您可以使用getattr內置函數以名稱動態訪問特定運算符。

演示:

>>> import operator         
>>> getattr(operator, 'eq')(1, 1)
True
>>> getattr(operator, 'eq')(1, 2)
False
>>> getattr(operator, 'lt')(1, 2)
True
>>> getattr(operator, 'lt')(2, 1)
False

我們可以使用它來重寫您的函數,如下所示。

import operator

def process(x, y, op):
    return getattr(operator, op)(x, y)

(根據需要添加健全性檢查。)

operator模塊是您想要的:

>>> import operator
>>> op_lookup = {'eq': operator.eq, 'gt': operator.gt, 'lt': operator.lt}
>>> 
>>> def process(x, y, op):
...     return op_lookup[op](x, y)
... 
>>> process(1, 1, 'eq')
True
>>> process(1, 1, 'lt')
False

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM