我有一段简单的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)
有人可以解释一下如何做到这一点吗?
答案 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。