第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 Pytransitions 中向現(xiàn)有狀態(tài)對象添加標(biāo)簽?

如何在 Pytransitions 中向現(xiàn)有狀態(tài)對象添加標(biāo)簽?

阿晨1998 2022-05-24 16:00:13
在我分配給我們的項目中,我們使用pytransitions. 我們的狀態(tài)被創(chuàng)建,配備了額外的屬性,并首先作為對象一個一個地添加到列表中。然后這個State對象列表被傳遞給一個Machine對象。這是一個簡單的例子:from transitions import Statestates = []state_initial = State("initial", on_exit="some_callback")text = "this is some text"state.text = textstates.append(state)這是一臺機(jī)器的創(chuàng)建方式:from transitions import Machinefrom some_library import SomeClassfrom my_module import user_transitionsclass User:    states = states    initial_state = states[0]    def __init__(self, some_param: str, another_param: SomeClass = default_param):        self.machine = Machine(model=self,                               states=User.states,                               initial=User.initial_state,                               transitions=user_transitions,                               prepare_event="preparing_callback",                               after_state_change="ending_callback")我想做的是在狀態(tài)對象創(chuàng)建時或之后向我的狀態(tài)添加標(biāo)簽。我的意思是 中的標(biāo)簽transitions.extensions.states,所以我可以使用is_tag文檔中的方法來獲取它們??紤]到我的傳統(tǒng)設(shè)置,類似state_initial.add_tags(["tag1", "tag2"])或 state_initial = State("initial", on_exit="some_callback", tags=["tag1", "tag2"]) 以任何其他方式。我該怎么做?
查看完整描述

1 回答

?
一只萌萌小番薯

TA貢獻(xiàn)1795條經(jīng)驗 獲得超7個贊

我的第一個建議是檢查您是否可以通過使用專用TextState而不是僅分配附加屬性來簡化狀態(tài)創(chuàng)建過程。這樣,您可以使您的狀態(tài)配置更易于理解。從 yaml 或 json 文件中讀取機(jī)器配置也變得更加容易。


from transitions import Machine, State

from transitions.extensions.states import Tags


# option a) create a custom state class and use it by default

# class TextState and CustomState could be combined of course

# splitting CustomState into two classes decouples tags from the 

# original state creation code

class TextState(State):


    def __init__(self, *args, **kwargs):

        self.text = kwargs.pop('text', '')

        super(TextState, self).__init__(*args, **kwargs)


class CustomState(Tags, TextState):

    pass



class CustomMachine(Machine):

    state_cls = CustomState



states = []

state_initial = CustomState("initial", text="this is some text")

# we can pass tags for initialization

state_foo = dict(name="foo", text="bar!", tags=['success'])

states.append(state_initial)

states.append(state_foo)


# [...] CustomMachine(model=self, states=User.states, initial=User.initial_state)

但是您的問題是關(guān)于如何在創(chuàng)建狀態(tài)后注入標(biāo)簽功能??赡苁且驗樗枰卮蟮闹貥?gòu)和深入挖掘來改變狀態(tài)創(chuàng)建。添加state.tags = ['your', 'tags', 'here']很好,應(yīng)該可以開箱即用地創(chuàng)建圖形和標(biāo)記。要開始state.is_<tag>工作,您可以更改其__class__屬性:


from transitions import Machine, State

from transitions.extensions.states import Tags


# option b) patch __class__

states = []

state_initial = State("initial")

state_initial.text = "this is some text"

# we can pass tags for initialization

state_foo = State("foo")

state_foo.text = "bar!"

state_foo.tags = ['success']

states.append(state_initial)

states.append(state_foo)


# patch all states

for s in states:

    s.__class__ = Tags

    s.tags = []


# add tag to state_foo

states[1].tags.append('success')


class User:


    states = states

    initial_state = states[0]


    def __init__(self):

        self.machine = Machine(model=self,

                               states=User.states,

                               initial=User.initial_state)


user = User()

user.to_foo()

assert user.machine.get_state(user.state).is_success  # works!

assert not user.machine.get_state(user.state).is_superhero  # bummer...

但同樣,根據(jù)我的經(jīng)驗,當(dāng)您努力將機(jī)器配置與代碼庫的其余部分分開時,代碼變得更加易于理解和重用。在代碼中的某處修補(bǔ)狀態(tài)并分配自定義參數(shù)可能會被下一個使用您的代碼的人忽略,當(dāng)狀態(tài)在兩個調(diào)試斷點之間更改其類時肯定會令人驚訝。


查看完整回答
反對 回復(fù) 2022-05-24
  • 1 回答
  • 0 關(guān)注
  • 87 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號