Enum类型的参数只有Python

时间:2016-01-27 11:41:04

标签: python python-2.7 enums

我有一段简单的Python代码,我有许多这样定义的枚举:

import sys
from time import sleep
from enum import Enum

class BW(Enum):
    LTE1p4           = 0
    LTE3             = 1
    LTE5             = 2
    LTE10            = 3
    LTE15            = 4
    LTE20            = 5

我希望类的成员函数只接受这个Enum类型作为参数,否则脚本不应该运行,这是我的主类:

class Breithorn:
    def __init__(self):
        self.RX_Settings = {}
        self.TX_Settings = {}

    def RX_BW(self,BW):
        self.RX_Settings['BW'] = BW

我希望成员函数只接受这类调用:

Breithorn.RX_BW(BW.LTE5)

拒绝(语法错误)这些调用:

Breithorn.RX_BW(44)

有人可以解释一下如何做到这一点吗?

3 个答案:

答案 0 :(得分:3)

你不能把它变成语法错误,因为在解析过程中会发现它,此时解析器不知道这些符号绑定到了什么。

您可以在函数运行时check the type并引发异常。

Python使用duck typing,来发现你需要单元或集成测试的这类问题。

答案 1 :(得分:1)

SyntaxError通常由Python本身发现,并表明Python不知道如何解析程序代码。例如:

if False;

SyntaxError,因为该行不以冒号(:)结尾。虽然你可以手动生成这样的一个:

    def RX_BW(self, BW_val):
        if not isinstance(BW_val, BW):
            raise SyntaxError('%s is not a member of %s' % (BW_val, BW))

这没有多大意义。您可能想要的是引发TypeError,因为传入的参数类型与期望值不匹配:

    def RX_BW(self, BW_val):
        if not isinstance(BW_val, BW):
            raise TypeError('%s is not a member of %s' % (BW_val, BW))
        self.RX_Settings['BW'] = BW_val

作为附注:注意我更改了参数的名称,以便我们可以检查Enum

答案 2 :(得分:0)

你唯一能做的就是使用assert在运行时检查它。 Python是完全动态类型的,所以你不能为这样的东西抛出语法错误。

class Breithorn:
    def __init__(self):
        self.RX_Settings = {}
        self.TX_Settings = {}

    def RX_BW(self,vat):
        assert isinstance(val,BW), "Breithorn.RX_BW(): input value is not of type BW"
        self.RX_Settings['BW'] = BW
如果未满足,

Assert会自动抛出AssertionError。