Après avoir expérimenté en essayant de mettre en œuvre des C pour boucles en Python, la fonction suivante a été développée:Pourquoi mes sections locales ne sont-elles pas mises à jour en dehors de rof?
import sys
def rof(init, cond, post):
init, cond, post, context = compile(init, '<rof>', 'exec'), \
compile(cond, '<rof>', 'eval'), \
compile(post, '<rof>', 'exec'), \
sys._getframe(1)
context = context.f_globals, context.f_locals
exec(init, *context)
while eval(cond, *context):
yield None
exec(post, *context)
Comme tout programmeur sait, la nouvelle fonction nécessaire à tester pour vous assurer qu'il fonctionne:
Configuration
class Employee:
def __init__(self, employee_id, category, hired, salary, years):
vars(self).update(locals())
def __repr__(self):
return '{}({})'.format(self.__class__.__name__,
', '.join(map(repr, self)))
def __iter__(self):
yield self.employee_id
yield self.category
yield self.hired
yield self.salary
yield self.years
database = [Employee(123, 'P', 2014, 2000, 0),
Employee(234, 'F', 2000, 20000, 14),
Employee(123, 'F', 2010, 10000, 4)]
le code fonctionne sans erreurs dans certains cas (comme celui ci-dessous):
Essai 1
for _ in rof('a = 0', 'a < len(database)', 'a += 1'):
employee_id = database[a].employee_id
for _ in rof('b = len(database) - 1', 'b > a', 'b -= 1'):
if database[b].employee_id == employee_id:
print(database[b], 'is being removed.')
del database[b]
Cependant, cela ne fonctionne pas lorsque les boucles sont dans une fonction séparée.
Essai 2
def remove_duplicates(database):
a = b = int
for _ in rof('a = 0', 'a < len(database)', 'a += 1'):
employee_id = database[a].employee_id
for _ in rof('b = len(database) - 1', 'b > a', 'b -= 1'):
if database[b].employee_id == employee_id:
print(database[b], 'is being removed.')
del database[b]
remove_duplicates(database)
Une erreur est generatated place (TypeError: list indices must be integers, not type
).
Nous pouvons tous convenir que ce code à ne pas Pythonic, mais quelqu'un peut-il identifier ce qui est à l'origine du problème et comment y remédier?
Puis-je demander pourquoi essayez-vous exactement de réaliser ce genre de comportement? –
Veuillez inclure le retraçage complet. – dano
Qu'essayez-vous d'accomplir avec 'a = b = int'? Je suis sûr que c'est la cause première. –