Python: как сделать функцию видимой во всей программе - PullRequest
0 голосов
/ 02 ноября 2009

У меня есть две функции, подобные следующим:

def fitnesscompare(x, y):    
    if x.fitness>y.fitness:
        return 1
    elif x.fitness==y.fitness:
        return 0
    else:  #x.fitness<y.fitness
        return -1

, которые используются с 'sort' для сортировки по различным атрибутам экземпляров классов.

Они используются внутри других функций и методов в программе.

Могу ли я сделать их видимыми везде, вместо того, чтобы передавать их каждому объекту, в котором они используются?

Спасибо

Ответы [ 2 ]

6 голосов
/ 02 ноября 2009

Лучший подход (чтобы получить видимость, о которой вы спрашиваете) состоит в том, чтобы поместить этот оператор def в модуль (скажем, fit.py), import fit из любого другого модуля, которому требуется доступ к элементам, определенным в этом, и используйте fit.fitnesscompare в любом из этих модулей по мере необходимости.

То, что вы спрашиваете, и что вам действительно нужно, может на самом деле отличаться ...:

как я объяснил в другом посте ранее сегодня, пользовательские функции сравнения не лучший способ настроить сортировку в Python (поэтому в Python 3 они даже больше не разрешены): скорее, Пользовательская функция извлечения ключей будет служить вам намного лучше (ориентирована на будущее, более общая, быстрее). Вместо звонка, скажем

somelist.sort(cmp=fit.fitnesscompare)

вызов

somelist.sort(key=fit.fitnessextract)

, где

def fitnessextract(x):
   return x.fitness

или, для действительно невероятной скорости,

import operator
somelist.sort(key=operator.attrgetter('fitness'))
1 голос
/ 02 ноября 2009

Определение функции с помощью def делает эту функцию доступной в пределах любой области действия , в которой вы ее определили. На уровне модуля использование def сделает эту функцию доступной для любой другой функции внутри этого модуля .

Можете ли вы опубликовать пример того, что не работает для вас? Код, который вы опубликовали, похоже, не связан с вашей реальной проблемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...