2016-11-04 8 views
0

Мне присвоен класс, который реализует очередь приоритетов, используя функцию для оценки приоритета.Как передать два аргумента с одной переменной в функцию?

class PriorityQueueWithFunction(PriorityQueue): 
    """ 
    Implements a priority queue with the same push/pop signature of the 
    Queue and the Stack classes. This is designed for drop-in replacement for 
    those two classes. The caller has to provide a priority function, which 
    extracts each item's priority. 
    """ 
    def __init__(self, priorityFunction): 
     # type: (object) -> object 
     "priorityFunction (item) -> priority" 
     self.priorityFunction = priorityFunction  # store the priority function 
     PriorityQueue.__init__(self)  # super-class initializer 

    def push(self, item): 
     "Adds an item to the queue with priority from the priority function" 
     PriorityQueue.push(self, item, self.priorityFunction(item)) 

Я также получил заданную функцию приоритета, которую я собираюсь инициализировать выше.

def manhattanHeuristic(position, problem, info={}): 
    "The Manhattan distance heuristic for a PositionSearchProblem" 
    xy1 = position 
    xy2 = problem.goal 
    return abs(xy1[0] - xy2[0]) + abs(xy1[1] - xy2[1]) 

Приведенный выше код предоставляется нам, и мы не можем его изменить. Я должен создать этот класс PriorityQueueWithFunction и нажать на него элемент. push Функция моего класса принимает аргумент, элемент. Но моя PriorityFunction занимает 2. Какие аргументы я должен использовать для ввода правильного элемента в мой класс, а также для того, чтобы моя приоритетная функция работала правильно?

Вот то, что я пытался, и я получаю ошибку компиляции, manhattanHeuristic ... принимает 2 аргумента, 1 дано

#Creating a queingFn 
queuingFn = PriorityQueueWithFunction(heuristic) 
Frontier = queuingFn 
#Creating the item that needs to be pushed 
StartState = problem.getStartState() 
StartNode = (StartState,'',0,(-1,-1)) 
#Here is my problem 
item = StartState , problem 
Frontier.push(item) 

Должен ли я изменить форму моего элемента? Есть идеи ?

+0

посмотрите на '* args' и' ** kwargs' , Они позволяют передавать произвольное количество данных в функцию с использованием одной (или двух) переменных. Вы можете распаковать их внутри функции. –

+0

В вашем случае это должно быть так же просто, как добавление звезды '*' infront 'item'. –

ответ

0

Вы должны сделать новый метод, который оборачивает вызов manhattanHeuristic:

# for item as dict: item = {'position': POS, 'problem': PROBLEM} 
def oneArgHeuristic(item): 
    position = item.position 
    problem = item.problem 
    return manhattanHeuristic(position, problem) 

# for item as tuple: item = (POS, PROBLEM) 
def oneArgHeuristic(item): 
    position, problem = item 
    return manhattanHeuristic(position, problem) 

и передать его в PriorityQueueWithFunction вместо оригинального одного