python 3 的 EAN13 校验和 class 使用理解列表

EAN13 checksum class for python 3 using comprehension list

我正在尝试更改此 python 2 class 以使其在 python 3 中工作 但不幸的是我被理解列表困住了

原文如下class:

class GTIN(object):

def __init__(self, barcode=''):
    self.barcode = barcode

def __checkDigit(self, digits):
        total = sum(digits) + sum(map(lambda d: d*2, digits[-1::-2]))
        return (10 - (total % 10)) % 10

def validateCheckDigit(self, barcode=''):
    barcode = (barcode if barcode else self.barcode)
    if len(barcode) in (8,12,13,14) and barcode.isdigit():
        digits = map(int, barcode)
        checkDigit = self.__checkDigit( digits[0:-1] )
        return checkDigit == digits[-1]
    return False

def addCheckDigit(self, barcode=''):
    barcode = (barcode if barcode else self.barcode)
    if len(barcode) in (7,11,12,13) and barcode.isdigit():
        digits = map(int, barcode)
        return barcode + str(self.__checkDigit(digits))
    return ''

这是我的菜鸟技能在哪里

class GTIN(object):

def __init__(self, barcode=''):
    self.barcode = barcode

def __checkDigit(self, digits):
        #total = sum(digits) + sum(map(lambda d: d*2, digits[-1::-2]))
        total = sum(digits) + sum([d*2 for d in digits[-1::-2]])
        return (10 - (total % 10)) % 10

def validateCheckDigit(self, barcode=''):
    barcode = (barcode if barcode else self.barcode)
    if len(barcode) in (8,12,13,14) and barcode.isdigit():
        #digits = map(int, barcode)
        digits = (int(s) for s in barcode)
        checkDigit = self.__checkDigit( digits[0:-1] )
        return checkDigit == digits[-1]
    return False

def addCheckDigit(self, barcode=''):
    barcode = (barcode if barcode else self.barcode)
    if len(barcode) in (7,11,12,13) and barcode.isdigit():
        #digits = map(int, barcode)
        digits = (int(s) for s in barcode)
        return barcode + str(self.__checkDigit(digits))
    return ''

我通过理解列表更改了所有地图功能,但现在我遇到了这个错误

TypeError: 'generator' object is not subscriptable

问题在这里:

digits = (int(s) for s in barcode)
return barcode + str(self.__checkDigit(digits))

之后,在 __checkDigit 中,您

total = sum(digits) + sum([d*2 for d in digits[-1::-2]])

要使 digits[-1::-2] 正常工作,digits 必须是一个列表,或某种其他类型的 "subscriptable"。在Python3、mapreturns一个生成器,所以你改了。但是您将其更改为另一种生成器 -- 生成器表达式。

您可以使用适当的列表理解(注意方括号):

digits = [int(s) for s in barcode]

或坚持使用map,但将生成器变成列表:

digits = list(map(int, barcode))