Typefout; Moet sleutelwoordargument of sleutelfunctie gebruiken in python 3.x

Ik ben nieuw in python en probeer een script te porten in 2.x naar 3.x. Ik kom de fout TypeError tegen; Moet sleutelwoordargument of sleutelfunctie gebruiken in python 3.x. Hieronder staat het stukje code: Help alstublieft

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) )

Antwoord 1, autoriteit 100%

Het lijkt erop dat het probleem in deze regel zit.

self.__working_arr[num].sort( key = lambda a,b: cmp(a.weights, b.weights) )

De aanroepbare keymag slechts één argument bevatten. Probeer:

self.__working_arr[num].sort(key = lambda a: a.weights)

Antwoord 2, autoriteit 37%

Exact dezelfde foutmelding verschijnt als u probeert de parameter keydoor te geven als een positionele parameter.

Fout:

sort(lst, myKeyFunction)

Correct:

sort(lst, key=myKeyFunction)

Python 3.6.6


Antwoord 3

In vervolg op het antwoord van @Kevin– en meer specifiek de opmerking/vraag van @featuresky:

functools.cmp_to_keygebruiken en cmp opnieuw implementeren (als vermeld in de portinggids) Ik heb een hacky-oplossing voor een scenario waarbij 2 elementen kunnen worden vergeleken via lambda-formulier. Om de OP als voorbeeld te gebruiken; in plaats van:

self.__working_arr[num].sort( key = lambda a,b: cmp(a.weights, b.weights) )

U kunt dit gebruiken:

from functools import cmp_to_key
[...]
def cmp(x, y): return (x > y) - (x < y)
self.__working_arr[num].sort(key=cmp_to_key(lambda a,b: cmp(a.weights, b.weights)))

Toegegeven, ik ben zelf een beetje nieuw in python en heb niet echt een goede beheersing van python2. Ik weet zeker dat de code op een veel betere / schonere manier kan worden herschreven en ik zou zeker graag een “juiste” manier horen om dit te doen.

OTOH in mijn geval was dit een handige hack voor een oud python2-script (bijgewerkt naar python3) dat ik op dit moment niet de tijd/energie heb om het “goed” te begrijpen en te herschrijven.

Afgezien van het feit dat het werkt, zou ik het gebruik van deze hack zeker niet aanraden! Maar ik dacht dat het de moeite waard was om te delen.

Other episodes