Pythonic方式处理增值税验证

时间:2012-01-31 10:21:52

标签: python

我有一个案例,我想验证输入的增值税号码。每个欧洲国家都有一个预定义的格式,我可以创建一个正则表达式模式来验证输入的数字。

我的问题是在20个国家处理这个问题的最“pythonic”方式。我应该为每个国家及其模式创建一个字典

实施例

VAT_PATTERNS = {
   'ES': '([A-Z0-9][0-9]{7}[A-Z0-9]$)',
   'DE': '([0-9]{9}$)',
}

还是有更多的pythonic方式?

有些国家/地区的模式相同。有些国家也可能有更复杂的模式。

我可以创建一个VAT基类,每个国家/地区的类继承并以这种方式处理它,但这看起来有点不合适。

4 个答案:

答案 0 :(得分:5)

“Zen of Python”(将import this输入解释器!)的一部分是“明确比隐含更好”和“简单比复杂更好”。

你所描述的看起来既简单又明确,所以我认为它非常pythonic。

答案 1 :(得分:1)

(我不确定这样的问题是否有真正的答案 - 什么是“pythonic”,什么不是仍然受到个人的影响 味道,恕我直言。但既然你要求它,这是我的看法。)

Zen of Python说:

  

明确比隐含更好。   简单比复杂更好。

所以,在你的情况下,我会说这是一个映射到VAT模式的国家,如 你提出,是最简单,最明确的解决方案,因此 最“pythonic”的。

答案 2 :(得分:1)

唯一需要改进的地方可能是将共享模式存储在以描述性名称命名的变量中(例如VAT_PATTERN_WESTERN_EUROPE),然后在地图值中使用它。

但是,由于这种情况不太可能发生变化,如果确实如此,它可能不会同时在所有国家发生变化,将其作为值中的常量表达似乎是更好的选择。

答案 3 :(得分:0)

我认为你的解决方案很棒;简单明了。假设西班牙,意大利和英国都使用相同的增值税(对不起,我是加拿大人;事实并非准确),你可以通过做这样的事情来减少重复:

VAT_PATTERNS = {
   'ES': '([A-Z0-9][0-9]{7}[A-Z0-9]$)',
   'DE': '([0-9]{9}$)',
}
VAT_PATTERNS['IT'] = VAT_PATTERNS['UK'] = VAT_PATTERNS['ES']

甚至更短:

VAT_PATTERNS = {
   'ES': '([A-Z0-9][0-9]{7}[A-Z0-9]$)',
   'DE': '([0-9]{9}$)',
}
V = VAT_PATTERNS # I like to use a short alias for speed
V['IT'] = V['UK'] = V['ES']
del V