Создание экземпляра в Python - PullRequest
0 голосов
/ 24 сентября 2018

У меня проблемы с созданием экземпляра в python.Я пытался переписать это многими способами, следуя советам из стека, но каким-то образом код все еще дает мне ошибку, что мой созданный экземпляр не является экземпляром PetriNet (namedtuple).Кто-нибудь может дать мне подсказку, что может быть не так?Я также добавляю тестовый код ошибок и полученную ошибку.

PetriNet = namedtuple(typename='PetriNet', field_names=['places', 'transitions', 'arcs'])
Place = namedtuple('Place', ['label', 'marking'])
Arc = namedtuple('Arc', ['source', 'target', 'weight'])

# You can use the ploting function to plot your petri net for S
example = PetriNet(places={Place('p1', 1), Place('p2', 0)}, 
                   transitions={'t1'}, 
                   arcs={Arc('p1', 't1', 1), Arc('t1', 'p2', 1)})

def make_synchronized_petri_net_S():
    PetriNet = namedtuple(typename='PetriNet', field_names=['places', 'transitions', 'arcs'])
    Place = namedtuple('Place', ['label', 'marking'])
    Arc = namedtuple('Arc', ['source', 'target', 'weight'])
    pet_places = [{Place('p11', 1), Place('p12', 0), Place('p21',1), Place('p22',0)}]
    pet_transitions = [{'a','b','c','d','e'}]
    pet_arcs = [{Arc('p11', 'a', 1), Arc('a', 'p12', 1), Arc('p12', 'b', 0), Arc('b', 'p11', 1), Arc('p12', 'c', 0), Arc('c', 'p12', 0), Arc('p21', 'c', 1), Arc('c', 'p22', 1), Arc('p22', 'e', 0), Arc('e', 'p21', 1), Arc('p22', 'd', 0), Arc('d', 'p21', 1)}]
    places = set()
    transitions = set()
    arcs = set()

    S = PetriNet(places,transitions,arcs)
    S = S._replace(places= pet_places, transitions=pet_transitions, arcs =pet_arcs)
    print("Our S is",S)
    return S

Это код для проверки ошибки:

S = make_synchronized_petri_net_S()
assert isinstance(S, PetriNet)
assert isinstance(S.places.pop(), Place)
assert isinstance(S.arcs.pop(), Arc)

и, наконец, ошибка: AssertionError в assert isinstance (S, PetriNet)

Большое спасибо за любые советы.

1 Ответ

0 голосов
/ 24 сентября 2018

Именованный кортеж PetriNet создается в двух местах: в глобальной области действия и в make_synchronized_petri_net_S.Это проблема, потому что экземпляры, созданные с использованием одного из них, не пройдут тест isinstance с использованием другого.isinstance(S, PetriNet) терпит неудачу, потому что S является make_synchronized_petri_net_S-PetriNet, но вторым аргументом является global-Petrinet.

Самое простое решение - удалить все объявления namedtle из вашей функции и использовать исключительно глобальные..

Кроме того, ваше утверждение isinstance(S.places.pop(), Place) не будет выполнено, поскольку pet_places представляет собой список наборов мест.Так что S.places.pop() не возвращает место, оно возвращает набор.Одним из возможных решений является изменение списка наборов в просто наборы, удалив квадратные скобки.Я не знаю, подходит ли это решение для вашей бизнес-логики, но, по крайней мере, оно устраняет ошибки AssertionErrors.

from collections import namedtuple

PetriNet = namedtuple(typename='PetriNet', field_names=['places', 'transitions', 'arcs'])
Place = namedtuple('Place', ['label', 'marking'])
Arc = namedtuple('Arc', ['source', 'target', 'weight'])

# You can use the ploting function to plot your petri net for S
example = PetriNet(places={Place('p1', 1), Place('p2', 0)}, 
                   transitions={'t1'}, 
                   arcs={Arc('p1', 't1', 1), Arc('t1', 'p2', 1)})

def make_synchronized_petri_net_S():
    pet_places = {Place('p11', 1), Place('p12', 0), Place('p21',1), Place('p22',0)}
    pet_transitions = {'a','b','c','d','e'}
    pet_arcs = {Arc('p11', 'a', 1), Arc('a', 'p12', 1), Arc('p12', 'b', 0), Arc('b', 'p11', 1), Arc('p12', 'c', 0), Arc('c', 'p12', 0), Arc('p21', 'c', 1), Arc('c', 'p22', 1), Arc('p22', 'e', 0), Arc('e', 'p21', 1), Arc('p22', 'd', 0), Arc('d', 'p21', 1)}
    places = set()
    transitions = set()
    arcs = set()

    S = PetriNet(places,transitions,arcs)
    S = S._replace(places= pet_places, transitions=pet_transitions, arcs =pet_arcs)
    print("Our S is",S)
    return S

S = make_synchronized_petri_net_S()
assert isinstance(S, PetriNet)
assert isinstance(S.places.pop(), Place)
assert isinstance(S.arcs.pop(), Arc)
...