#1 by Aysegul_Engin
Hello everyone.
I am writing an experiment where the participant chooses between 2 lotteries and receives feedback in the next round. The experiment is set to have 3 treatments and I am coding all treatments in one app. To inform participants about the outcome in round = n I am calling the set_outcome method in round = n before next page.
In the base treatment this workflow works perfectly. However in the other 2 treatments I receive a Type error. (TypeError: player.outcome is None.) Can anyone help me understand why this is happening?
The minimal code is below:
class C(BaseConstants):
REWARD = 100 # in the storyline points won for each lottery
def creating_session(subsession: Subsession):
# Set balanced treatments
import itertools
treatments = itertools.cycle(["Base", "Recommender", "DSS"])
for player in subsession.get_players():
player.treatment = next(treatments)
class Player(BasePlayer):
treatment = models.StringField(doc = "The treatment variable")
outcome = models.IntegerField(doc = "The outcome of the round for the chosen lottery")
def set_outcome(player):
outcomes = [C.REWARD, 0]
if player.choice == "A":
outcome = random.choices(outcomes, weights = (player.lottery_A_success_prob, 1-player.lottery_A_success_prob), k=1)
else:
outcome = random.choices(outcomes, weights = (player.lottery_B_success_prob, 1-player.lottery_B_success_prob), k=1)
player.outcome = int(outcome[0])
return player.outcome
def vars_for_template1(player:Player):
for p in player.subsession.get_players():
if p.round_number > 1:
return dict(previous_outcome = p.in_round(p.round_number - 1).outcome)
class Choice(Page):
form_model = "player"
form_fields = ["choice"]
@staticmethod
def before_next_page(player, timeout_happened):
set_outcome(player)
set_recommendation(player)
set_payoff(player)
if player.round_number < C.NUM_ROUNDS:
set_counts(player)
vars_for_template = vars_for_template1
According to the error message the line `return dict(previous_outcome = p.in_round(p.round_number - 1).outcome)` is creating the problem. However I don't understand why it works in the base treatment.
Thank you vey much for your help.
Ayşegül
#2 by Aysegul_Engin
Maybe one small additional information. The treatments differ only on the basis of the templates.
The template, where the treatments are making a difference seem like in the following code:
{{ block title }}
Round {{ player.round_number }} of {{ C.NUM_ROUNDS }}
{{ endblock }}
{{ block content }}
{{ if subsession.round_number < 11 }}
<p>
<b> This is a tryout round! </b>
</p>
{{ endif }}
{{ if subsession.round_number > 1 }}
{{if player.treatment == "Base"}}
<p>Your outcome in the last round is {{ previous_outcome }}.</p>
{{ else }}
{{if player.treatment == "Recommender"}}
<p>Your outcome in the last round is {{ previous_outcome }}.</p>
<p>Based on your past choices, the computer recommends you to choose: <b>{{player.recommendation}}</b></p>
{{ else }}
{{if player.treatment == "DSS"}}
<p>Your outcome in the last round is {{ previous_outcome }}.</p>
<p>The table below shows the number of times that lotteries yielded prize according to your choices. </p>
<table class="table">
<tr>
<th> Lottery A </th>
<th> Lottery B </th>
</tr>
<tr>
<td>{{player.non_zero_outcome_count_A}}</td>
<td>{{player.non_zero_outcome_count_B}}</td>
</tr>
</table>
{{ endif }}
{{ endif }}
{{ endif }}
{{ endif }}
{{ formfields }}
{{ next_button }}
Apart from these differences in all treatments everything is the same.