2012-03-20 5 views
0

Я пытаюсь кэшировать вывод метода python, поэтому для ключа кеша я использую хеш (метод) + сериализованные аргументы. Я использую один сервер memcached для нескольких рабочих машин.Идентификатор уникального метода Python

Проблема в том, что хэш (метод) оказался непоследовательным в отношении этих рабочих машин и процессов.

class Foo(object): 
    def bar(): 
     pass 

x = Foo() 
hash(x.bar) #was inconsistent across machines/processes 

ID() не будет работать, потому что это место памяти и, следовательно, работает только на одной машине.

Спасибо!

+0

@ delnan: О, мы хешируем функции ... Nvm –

+0

@NiklasB. что вы рекомендуете, я беру хэш MD5? Функция принимает строковый ввод ... – djs22

+0

djs22: Аргументы и какое-то полное имя функции. Это уже решена проблема, однако, просто посмотрите на ссылки, представленные во втором ответе. –

ответ

1
+0

Спасибо dgorissen! Я закончил использование кода из github 1vamp в качестве базы для написания правильно реализованных полнофункциональных имен функций. – djs22

1

Вместо этого я бы использовал имя функции, например x.foo.__name__.

+0

Да, но как насчет функций с тем же именем в разных классах/модулях? – djs22

+0

@ djs22: Очевидно, вы должны включить имя модуля/класса в этом случае. –

+0

Не указывайте функции с тем же именем, если вы будете их использовать на основе их имен? – kindall

1

Настройка на коверкая имя функции, которая будет принимать имя класса и имя метода, чтобы создать строку, а затем взять хэш для строка. Например, пусть x - это метод

def method_hash(x): 
    return hash("{0}.{1}".format(x.__objclass__.__name__, x.__name__)) 

Предполагается, что этот метод относится к классу, а не к определенному объекту. Если из объекта тогда можно использовать x.__self__.__name__.

+0

Функция '__class__' функций' ', по крайней мере в 3.x (она * может * работать в 2.x со своими« несвязанными методами », но я бы не стал делать ставку на нее). – delnan

+0

@delnan Спасибо, что поймали мою ошибку на '__class__', я отредактировал свой ответ, чтобы обработать его. –

+0

Хороший ответ, но из-за причины, не указанной в исходном вопросе (мне нужно сгенерировать этот уникальный идентификатор в декораторе), не всегда легко определить, находитесь ли вы в классе/объекте/или просто модуле. – djs22

Смежные вопросы