TypeError; il Faut utiliser le mot clé de l'argument ou la clé de fonction en python 3.x
Je suis nouveau sur le python, en essayant de port d'un script en 2.x à 3.x je rencontre l'erreur TypeError; il Faut utiliser le mot clé de l'argument ou la clé de fonction en python 3.x. Ci-dessous le morceau de code: s'il vous Plaît aider
def resort_working_array( self, chosen_values_arr, num ):
for item in self.__working_arr[num]:
data_node = self.__pairs.get_node_info( item )
new_combs = []
for i in range(0, self.__n):
# numbers of new combinations to be created if this item is appended to array
new_combs.append( set([pairs_storage.key(z) for z in xuniqueCombinations( chosen_values_arr+[item], i+1)]) - self.__pairs.get_combs()[i] )
# weighting the node
item.weights = [ -len(new_combs[-1]) ] # node that creates most of new pairs is the best
item.weights += [ len(data_node.out) ] # less used outbound connections most likely to produce more new pairs while search continues
item.weights += [ len(x) for x in reversed(new_combs[:-1])]
item.weights += [ -data_node.counter ] # less used node is better
item.weights += [ -len(data_node.in_) ] # otherwise we will prefer node with most of free inbound connections; somehow it works out better ;)
self.__working_arr[num].sort( key = lambda a,b: cmp(a.weights, b.weights) )
Je ne peux pas exécuter ce qu'il n'est pas un MCVE, de sorte qu'il est difficile de diagnostiquer complètement le problème. Mais un rapide coup d'œil, le
oh!! Parfait cela fonctionne. Merci Kevin, u m'a sauvé beaucoup de temps.
C'est une nouvelle addition à Python3, également une bonne lecture pertinente de la PEP: python.org/dev/peps/pep-3102
key
argument du lambda n'est censé prendre un argument. Avez-vous essayé sort(key = lambda a: a.weights)
?oh!! Parfait cela fonctionne. Merci Kevin, u m'a sauvé beaucoup de temps.
C'est une nouvelle addition à Python3, également une bonne lecture pertinente de la PEP: python.org/dev/peps/pep-3102
OriginalL'auteur tyranno | 2015-04-29
Vous devez vous connecter pour publier un commentaire.
Dirait que le problème est dans cette ligne.
La
key
appelable devrait prendre qu'un seul argument. Essayez:FWIW j'ai frappé un problème semblable à vous. Je ne serais pas très recommandé (surtout parce que je ne sais pas vraiment ce que je fais), mais je viens de poster un hack (une réponse) qui peut être d'une certaine valeur pour vous?!
OriginalL'auteur Kevin
Exactement le même message d'erreur s'affiche si vous essayez de passer la clé paramètre comme un paramètre de position.
Mal:
Correct:
Python 3.6.6
sort(*, key=None, reverse=False)
, notez que le premier paramètre prend un nombre arbitraire de position argument (même si normalement vous venez de passer un objet, une liste par exemple), de sorte que vous utiliser l'argument nommé pourkey
etreverse
.OriginalL'auteur Jarekczek
À la suite de la réponse par @Kevin - et plus particulièrement le commentaire/question par @featuresky:
À l'aide de functools.cmp_to_key et de réimplanter cmp (comme indiqué dans le le portage de guide) j'ai un hacky solution de contournement pour un scénario où les 2 éléments peuvent être comparés par lambda forme. Utilisation de l'OP comme un exemple; au lieu de:
Vous pouvez utiliser ceci:
Certes, je suis un peu nouveau pour python moi-même et ne pas vraiment avoir une bonne poignée sur python2. Je suis sûr que le code pourrait être réécrit dans une bien meilleure/le moyen le plus propre, et je n'aurais aime entendre un "bon" moyen de le faire.
Otoh, que dans mon cas, cela a été une pratique hack pour un vieux python2 script (mis à jour pour python3) que je n'ai pas le temps/l'énergie "correctement" de comprendre et de réécrire maintenant.
Au-delà du fait que cela fonctionne, je ne serait certainement pas recommander une large utilisation de ce hack! Mais j'ai pensé que c'était le partage de la valeur.
OriginalL'auteur Jeremy Davis