2017-11-29 1 views
0

Erstens, ich weiß, ich sollte nicht globals() verwenden. Ich kenne Ich sollte nicht. Aber ich benutze eine benutzerdefinierte Django-API, die es mir nicht erlaubt, Sammlungen zu verwenden (soweit ich das beurteilen kann), also bin ich ziemlich fest mit der Verwendung von globals() beschäftigt.Deklarieren von Objekten für globals() mit einer verschachtelten for-Schleife

Ich versuche ein Spiel zu entwickeln, in dem ein Spieler 1 Wahl in der ersten Runde, 2 Wahlen in der zweiten Runde, 4 Wahlen in der dritten Runde hat (also ist die Formel zur Berechnung der Wahl pro Runde num_choices = 2)^num_rounds). Natürlich hat die erste Runde nur eine Wahl, also erkläre ich das statisch. Doch für die folgenden Runden Ich versuche, den folgenden Code zu verwenden:

for i in range(2, NUM_ROUNDS): 
    dec_num = math.pow(2, i) 
    for j in range(1, int(dec_num)): 
     globals()['dec_r{}_{}'.format(i).format(j)] = models.CharField(
      choices=list_of_choices, 
      widget=widgets.RadioSelect(), 
      blank=False, 
      initial='blank' 
) 

aber wenn ich versuche, meine Django app zu laufen, erhalte ich folgende Fehler (und Traceback):

Traceback (most recent call last): 
File "/Library/Frameworks/Python.framework/Versions/3.5/bin/otree", line 11, in <module> 
sys.exit(otree_cli()) 
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/otree/management/cli.py", line 113, in otree_cli 
execute_from_command_line(argv) 
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/otree/management/cli.py", line 133, in execute_from_command_line 
utility.execute() 
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/django/core/management/__init__.py", line 328, in execute 
django.setup() 
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/django/__init__.py", line 18, in setup 
apps.populate(settings.INSTALLED_APPS) 
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/django/apps/registry.py", line 108, in populate 
app_config.import_models(all_models) 
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/django/apps/config.py", line 198, in import_models 
self.models_module = import_module(models_module_name) 
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/importlib/__init__.py", line 126, in import_module 
return _bootstrap._gcd_import(name[level:], package, level) 
File "<frozen importlib._bootstrap>", line 986, in _gcd_import 
File "<frozen importlib._bootstrap>", line 969, in _find_and_load 
File "<frozen importlib._bootstrap>", line 958, in _find_and_load_unlocked 
File "<frozen importlib._bootstrap>", line 673, in _load_unlocked 
File "<frozen importlib._bootstrap_external>", line 662, in exec_module 
File "<frozen importlib._bootstrap>", line 222, in _call_with_frames_removed 
File "/Users/_____/exp_econ_test/turn_taking_strategic_match_all_players/models.py", line 209, in <module> 
class Player(BasePlayer): 
File "/Users/_____/exp_econ_test/turn_taking_strategic_match_all_players/models.py", line 261, in Player 
initial=Constants.choice1_name 
IndexError: tuple index out of range 

I Es hat etwas damit zu tun, wie ich den Variablennamen deklariere. Gibt es eine Alternative, die ich verwenden kann? Vielen Dank!

+0

Welche Zeile verursacht diesen Fehler? –

+0

Versuchen Sie außerdem, Modellfelder im globalen Bereich zu erstellen? Das wird wahrscheinlich nichts Nützliches bewirken. Was willst du eigentlich erreichen? –

+0

Die Zeile, die den Fehler verursacht, ist anscheinend "initial = 'blank'", aber wenn ich sie entferne, wird stattdessen der Fehler von blank = False ausgelöst. Wenn ich es unter Verwendung dieser Methode unter Verwendung nur der runden Zahl deklariere, stoße ich nicht auf dieselben Probleme: http://stupidpythonideas.blogspot.com.au/2013/05/why-you-dont-want-to-dynamically- create.html – Krabo

Antwort

0

Obwohl Ihre Frage Modelle erwähnt, in den Kommentaren sprechen Sie über Formularfelder. Sie sollten nichts davon tun, aber fügen Sie die Felder in der __init__ Methode des Formulars hinzu.

self.fields['whatever'] = forms.CharField(...) 
+0

Otree hat eine participants.vars-Variable und eine session.vars-Variable, so dass es möglich ist, diese zu verwenden. – Krabo

Verwandte Themen