Заполнение значений через файл, такой как Excel - PullRequest
0 голосов
/ 28 сентября 2018

Следуя классу Python, я создал его с помощью pyasn, и мне нравится видеть возможность передачи значения через файл, а не способа создания объекта и передачи значений для членов через значение типа object.types, которые являются строковыми ичисло будет в листе Excel, что означает, что все параметры, значения которых не являются другой схемой, будут присутствовать в листе Excel (схема указывает класс, такой как Credit_card)

from pyasn1.type import univ, char, namedtype, namedval, tag, constraint, useful


class Card_type(univ.Enumerated):
    pass


Card_type.namedValues = namedval.NamedValues(
    ('cb', 0),
    ('visa', 1),
    ('eurocard', 2),
    ('diners', 3),
    ('american-express', 4)
)


class Client(univ.Sequence):
    pass


Client.componentType = namedtype.NamedTypes(
    namedtype.NamedType('name', char.PrintableString().subtype(subtypeSpec=constraint.ValueSizeConstraint(1, 20)).subtype(implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 0))),
    namedtype.OptionalNamedType('street', char.PrintableString().subtype(subtypeSpec=constraint.ValueSizeConstraint(1, 50)).subtype(implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 1))),
    namedtype.NamedType('postcode', char.NumericString().subtype(subtypeSpec=constraint.ValueSizeConstraint(5, 5)).subtype(implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 2))),
    namedtype.NamedType('town', char.PrintableString().subtype(subtypeSpec=constraint.ValueSizeConstraint(1, 30)).subtype(implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 3))),
    namedtype.DefaultedNamedType('country', char.PrintableString().subtype(subtypeSpec=constraint.ValueSizeConstraint(1, 20)).subtype(implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 4)).subtype(value="France"))
)


class Credit_card(univ.Sequence):
    pass


Credit_card.componentType = namedtype.NamedTypes(
    namedtype.NamedType('type', Card_type().subtype(implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 0))),
    namedtype.NamedType('number', char.NumericString().subtype(subtypeSpec=constraint.ValueSizeConstraint(20, 20)).subtype(implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 1))),
    namedtype.NamedType('expiry-date', char.NumericString().subtype(subtypeSpec=constraint.ValueSizeConstraint(6, 6)).subtype(implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 2)))
)


class Payment_method(univ.Choice):
    pass


Payment_method.componentType = namedtype.NamedTypes(
    namedtype.NamedType('check', char.NumericString().subtype(subtypeSpec=constraint.ValueSizeConstraint(15, 15)).subtype(implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 0))),
    namedtype.NamedType('credit-card', Credit_card().subtype(implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 1))),
    namedtype.NamedType('cash', univ.Null().subtype(implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 2)))
)


class Order_header(univ.Sequence):
    pass


Order_header.componentType = namedtype.NamedTypes(
    namedtype.NamedType('reference', char.NumericString().subtype(subtypeSpec=constraint.ValueSizeConstraint(12, 12)).subtype(implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 0))),
    namedtype.NamedType('date', char.NumericString().subtype(subtypeSpec=constraint.ValueSizeConstraint(8, 8)).subtype(implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 1))),
    namedtype.NamedType('client', Client().subtype(implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 2))),
    namedtype.NamedType('payment', Payment_method().subtype(implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 3)))
)


class Order(univ.Sequence):
    pass


Order.componentType = namedtype.NamedTypes(
    namedtype.NamedType('header', Order_header().subtype(implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatConstructed, 0))),
    #namedtype.NamedType('items', univ.SequenceOf(componentType=Order_line()).subtype(implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 1)))
)




a=Order()
a['header']['reference']='abcdefghixcv'
print a

#Output
Order:
 header=Order_header:
  reference=abcdefghixcv

Можем ли мы передать значения для asn для вышеупомянутогонапример, через файл, такой как Excel? Как ссылка с 'abcdefghixcv'.

1 Ответ

0 голосов
/ 03 октября 2018

Вопрос : Можем ли мы передать значения для asn для приведенного выше примера через файл

С учетом следующих данных, полученных из любых файлов:

Примечание : для этого примера client_data удерживается во втором файле, на который ссылается id == 12345!data значения уже присвоены NamedType из class Order['header'] и class Client.

client_data = {'12345':{'name':'John', 'town':'New York'}}
data = {'reference': 'abc', 'date': '2018-10-03', 'client': '12345', 'payment': 'cash'}

Для краткости я сократил ваши определения классов до единственных используемых частей.

class NumericString():
    def __init__(self, value):
        self.value = value
    def __str__(self):
        return self.value
    def __new__(arg):
        obj = object.__new__(NumericString)
        obj.__init__(arg)
        return obj

class Payment_method():
    def __init__(self, method):
        self.method = method
    def __str__(self):
        return self.method        
    def __new__(arg):
        obj = object.__new__(Payment_method)
        obj.__init__(arg)
        return obj

class Client():
    def __init__(self, data):
        self.data = data
    def __str__(self):
        return ", ".join(self.data.values())
    def __new__(id):
        obj = object.__new__(Client)
        obj.__init__(id)
        return obj

Полагаю, следующее asn1_schema может быть получено из class Order(), но для простоты я определил его вручную.

asn1_schema = {'reference':NumericString, 'date':NumericString, 'client':Client, 'payment':Payment_method}

Этот пример привязан к данным , это означает, что Dict data знает, какой класс Order['header'] должен создать.Поэтому никаких предопределенных Order не требуется.

# For simplicity, define order as a 'dict'
order = {'header':{}}

# Loop over the given data dict
for key in data:
    # Create a class maped from asn1_schema and pass data value
    if key == 'client':
        # For client pass data from 'client_data' using 'id'
        cls = asn1_schema[key].__new__(client_data[data[key]])
    else:
        cls = asn1_schema[key].__new__(data[key])

    # Update order header with this 'NamedType'
    order['header'][key] = cls

# Show the resulting order header
for key in order['header']:
    types = order['header'][key]
    print("{:10}:\t{:14}:\tvalue:{}".format(key, types.__class__.__name__, types))

Выход :

date      : NumericString :     value:2018-10-03
reference : NumericString :     value:abc
client    : Client        :     value:John, New York
payment   : Payment_method:     value:cash

Протестировано с Python: 3.5.3

...