oTree學習教程(七)Apps & rounds
應用
在oTree(和Django)中,app是一個包含Python和HTML程式碼的資料夾。當您建立oTree專案時,它會預先載入各種應用程式,例如 public_goods
和dictator
。會話基本上是一個接一個顯示的應用程式序列。
建立應用
輸入:
這將基於oTree模板建立一個新的app資料夾,其中大部分結構已經為您設定。
關鍵檔案是models.py,pages.py和templates /資料夾下的HTML檔案。
您可以將其視為可以根據需要新增的骨架。 您可以新增自己的類,函式,方法和屬性,也可以匯入任何第三方模組。
然後轉到settings.py並在SESSION_CONFIGS中為您的應用建立一個與其他條目類似的條目。
組合應用
在您的SESSION_CONFIGS中,您可以通過設定組合應用程式'app_sequence'
。
在應用程式之間傳遞資料
回合
您可以通過在models.py中設定Constants.num_rounds來使遊戲執行多輪。 例如,如果您的會話配置的app_sequence是['app1','app2'],其中app1的num_rounds = 3且app2的num_rounds = 1,那麼您的會話將包含4個子會話。
回合數
您可以使用self.round_number
(此屬性出現在subsession,group,player和page物件上)來獲取當前的輪數。回合數字從1開始。
在輪次或應用程式之間傳遞資料
每輪都有單獨的Subsession,Group和Player物件。 例如,假設您在第1輪中設定self.player.my_field = True。在第2輪中,如果您嘗試訪問self.player.my_field,您會發現其值為None(假設這是該欄位的預設值)。 這是因為第1輪中的Player物件與第2輪中的Player物件是分開的。
要訪問上一輪或應用程式中的資料,您可以使用下面描述的技術之一。
in_rounds,in_previous_rounds,in_round等
Player,group和subsession物件具有以下方法,它們的工作方式類似:
- in_previous_rounds()
- in_all_rounds()
- in_rounds()
- in_round()
player.in_previous_rounds()和player.in_all_rounds()每個都返回一個代表相同應用前幾輪中同一參與者的玩家列表。 區別在於in_all_rounds()包括當前回合的玩家。
例如,如果您想計算參與者對所有前幾輪遊戲的收益,加上當前遊戲的收益:
player.in_rounds(m,n)返回表示從輪次m到n的同一參與者的玩家列表。
player.in_round(m)只返回第m輪的玩家。 例如,要獲得上一輪玩家的回報,你可以使用self.player.in_round(self.round_number - 1).payoff。
類似地,subsession物件具有以相同方式工作的方法in_previous_rounds(),in_all_rounds(),in_rounds(m,n)和in_round(m)。
組物件也有方法in_previous_rounds(),in_all_rounds(),in_rounds(m,n)和in_round(m),但請注意,如果在輪之間重新組合組,則這些方法可能不會返回任何有意義的內容。
participant.vars
如果要在不同應用程式之間傳遞資料,則應將此資料儲存在參與者中,該資料在應用程式中保留(請參閱參與者)。 (in_all_rounds()僅在您需要訪問同一應用程式的上一輪資料時才有用。)
participant.vars是一個可以儲存任何資料的字典。 例如,您可以設定如下屬性:
稍後在會話中(例如在單獨的應用程式中),您可以像這樣檢索它:
如在這裡所述,可以從頁面或玩家訪問當前參與者:
只要您檢索Player例項(例如,使用get_players()或get_player_by_role()等),您也可以從Group或Subsession訪問它。
如果您的key可能存在,也可能不存在,您可以使用.get()方法。 例如,self.participant.vars.get('my_var',DEFAULT_VALUE)。 更多這裡。
或者您可以在self.participant.vars中測試'my_var'是否與'my_var'一起存在。
注意:participant.vars不包含在Excel / CSV資料匯出中,也不包含在會話管理員的“資料”選項卡中。 如果需要,可以在player上建立一個StringField(例如,名為participant_vars_dump),然後在會話結束時指定:
(同樣的概念適用於下面的session.vars。)
session.vars
對於會話中所有參與者相同的全域性變數,可以使用self.session.vars。 這是一個像participant.vars一樣的字典。 不同之處在於,如果在self.session.vars中設定變數,它將應用於會話中的所有參與者,而不僅僅是一個。
如此處所述,可以從Page物件或任何模型(Player,Group,Subsession等)訪問會話物件。
可變輪數
如果你想要一個可變數量的輪數,考慮設定num_rounds
為某個高數字,然後在你的應用程式中,有條件地隱藏 元素,這樣使用者就無法進入下一頁。{% next_button %}