103 votes

l'élément #0 de la séquence de mise à jour du dictionnaire a une longueur de 3 ; 2 est nécessaire

Je veux ajouter des lignes à l'objet account.bank.statement.line par l'intermédiaire d'un autre objet Mais j'obtiens l'erreur suivante :

"L'élément de séquence de mise à jour du dictionnaire #0 a une longueur de 3 ; 2 est requis"

Voici mon code :

def action_account_line_create(self, cr, uid, ids):
    res = False
    cash_id = self.pool.get('account.bank.statement.line')
    for exp in self.browse(cr, uid, ids):
        company_id = exp.company_id.id
        #statement_id = exp.statement_id.id
        lines = []
        for l in exp.line_ids:
            lines.append((0, 0, {
                'name': l.name,
                'date': l.date,
                'amount': l.amount,
                'type': l.type,
                'statement_id': exp.statement_id.id,
                'account_id': l.account_id.id,
                'account_analytic_id': l.analytic_account_id.id,
                'ref': l.ref,
                'note': l.note,
                'company_id': l.company_id.id
            }))

        inv_id = cash_id.create(cr, uid, lines,context=None)
        res = inv_id
    return res 

Je l'ai modifié, mais ensuite j'ai rencontré cette erreur :

  File "C:\Program Files (x86)\OpenERP 6.1-20121029-003136\Server\server\.\openerp\workflow\wkf_expr.py", line 68, in execute
  File "C:\Program Files (x86)\OpenERP 6.1-20121029-003136\Server\server\.\openerp\workflow\wkf_expr.py", line 58, in _eval_expr
  File "C:\Program Files (x86)\OpenERP 6.1-20121029-003136\Server\server\.\openerp\tools\safe_eval.py", line 241, in safe_eval
  File "C:\Program Files (x86)\OpenERP 6.1-20121029-003136\Server\server\.\openerp\tools\safe_eval.py", line 108, in test_expr
  File "<string>", line 0   
   ^
SyntaxError: unexpected EOF while parsing

Code :

def action_account_line_create(self, cr, uid, ids, context=None):
    res = False
    cash_id = self.pool.get('account.bank.statement.line')
    for exp in self.browse(cr, uid, ids):
        company_id = exp.company_id.id
        lines = []
        for l in exp.line_ids:
            res = cash_id.create ( cr, uid, {
                'name': l.name,
                'date': l.date,
                'amount': l.amount,
                'type': l.type,
                'statement_id': exp.statement_id.id,
                'account_id': l.account_id.id,
                'account_analytic_id': l.analytic_account_id.id,
                'ref': l.ref,
                'note': l.note,
                'company_id': l.company_id.id
            }, context=None)
    return res

99voto

Leo Points 1

Cette erreur s'est produite parce que vous essayez de mettre à jour dict en utilisant une séquence erronée ( list o tuple ).

cash_id.create(cr, uid, lines,context=None) en essayant de convertir lines dans l'objet dict :

(0, 0, {
    'name': l.name,
    'date': l.date,
    'amount': l.amount,
    'type': l.type,
    'statement_id': exp.statement_id.id,
    'account_id': l.account_id.id,
    'account_analytic_id': l.analytic_account_id.id,
    'ref': l.ref,
    'note': l.note,
    'company_id': l.company_id.id
})

Supprimez le deuxième zéro de ce tuple pour le convertir correctement en un objet dict.

Pour le tester vous-même, essayez ceci dans le shell python :

>>> l=[(0,0,{'h':88})]
>>> a={}
>>> a.update(l)

Traceback (most recent call last):
  File "<pyshell#11>", line 1, in <module>
    a.update(l)
ValueError: dictionary update sequence element #0 has length 3; 2 is required

>>> l=[(0,{'h':88})]
>>> a.update(l)

24voto

Ian Michel Points 129

J'obtenais cette erreur lorsque je mettais à jour le dictionnaire avec une syntaxe incorrecte :

Essayez avec ça :

lineItem.values.update({attribute,value})

au lieu de

lineItem.values.update({attribute:value})

7voto

AB Abhi Points 918

Une des façons rapides de créer un dict à partir de tuples de longueur égale :

>>> t1 = (a,b,c,d)
>>> t2 = (1,2,3,4)
>>> dict(zip(t1, t2))
{'a':1, 'b':2, 'c':3, 'd':4, }

4voto

Joren Van Severen Points 1899

Ce n'est pas vraiment une réponse à la question spécifique, mais s'il y a d'autres personnes, comme moi, qui obtiennent cette erreur dans fastAPI et se retrouvent ici :

C'est probablement parce que la réponse de votre route a une valeur qui ne peut pas être sérialisée par JSON par jsonable_encoder . Pour moi, c'était WKBElement : https://github.com/tiangolo/fastapi/issues/2366

Comme dans le problème, j'ai fini par supprimer la valeur de la sortie.

1voto

Herker Points 145

J'ai dictionary update sequence element #0 has length 3; 2 is required
Lorsque j'ai essayé de convertir un dict en une liste en utilisant .values()

Je l'ai résolu en utilisant .items()

list(dict(new_row.items()))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X