Функция лямбды для классов в Python?

Проверьте это ... не используя пакет.

with open("test.txt") as f:
  lines = [ line.strip().split(",") for line in f ]
  lines = [{ 
        "string": line[0], 
        "integer1": int(line[1]), 
        "integer2": int(line[2]), 
        "list1": [l for l in line[3].strip("()").split("/")],
        "list2": [l for l in line[4].strip("()").split("/")],
  } for line in lines ]
  print(lines)
9
задан Justin Standard 11 December 2008 в 19:03
поделиться

5 ответов

Нет никакой потребности в лямбде вообще. лямбда является просто синтетическим сахаром, чтобы определить функцию и использовать его одновременно. Точно так же, как любой вызов лямбды может быть заменен явным определением, мы можем решить Вашу проблему путем создания реального класса, который удовлетворяет потребности и возврат его.

class Double:
        def run(self,x):
            return x*2

class Triple:
    def run(self,x):
        return x*3

def createMultiplier(n):
    class Multiply:
        def run(self,x):
            return x*n
    return Multiply

class Library:
    def __init__(self,c):
        self.c = c()
    def Op(self,val):
        return self.c.run(val)

op1 = Double
op2 = Triple
op3 = createMultiplier(5)

lib1 = Library(op1)
lib2 = Library(op2)
lib3 = Library(op3)

print lib1.Op(2)
print lib2.Op(2)
print lib3.Op(2)
8
ответ дан 4 December 2019 в 09:38
поделиться

Библиотека действительно указывает, что хочет "неинициализированную версию" (т.е. ссылка класса)?

Это смотрит на меня, как будто библиотека на самом деле хочет объектную фабрику. В этом случае приемлемо ввести:

lib3 = Library(lambda: Multiply(5))

Чтобы понять, как лямбда работает, рассмотрите следующее:

Multiply5 = lambda: Multiply(5)
assert Multiply5().run(3) == Multiply(5).run(3)
11
ответ дан 4 December 2019 в 09:38
поделиться

Это - вид обмана, но Вы могли дать Ваш Умножать класс a __call__ метод, который возвращает себя:

class Multiply:
    def __init__(self,mult):
        self.mult = mult
    def __call__(self):
        return self
    def run(self,x):
        return x*self.mult

Тот путь, когда библиотека звонит c() это на самом деле звонит c.__call__() который возвращает объект, Вы хотите.

1
ответ дан 4 December 2019 в 09:38
поделиться
def mult(x):
    def f():
        return Multiply(x)
    return f


op3 = mult(5)
lib3 = Library(op3)
print lib3.Op(2)
1
ответ дан 4 December 2019 в 09:38
поделиться

Если я понимаю Ваше пространство задач правильно, у Вас есть общий интерфейс, который берет 1 аргумент, который называют с помощью Library класс. К сожалению, вместо того, чтобы вызвать функцию, Library предполагает, что функция перенесена в класс с a run метод.

Можно, конечно, создать эти классы программно. Классы могут быть возвращены методами, и благодаря понятию закрытий необходимо смочь перенести любую функцию в Класс, который удовлетворяет потребности. Что-то как:

def make_op(f):
  class MyOp(object):
    def run(self, x):
      return f(x)
  return MyOp

op1 = make_op(lambda x: return x*2)
op2 = make_op(lambda x: return x*3)

def multiply_op(y):
    return make_op(lambda x: return x*y)

op3 = multiply_op(3)

lib1 = Library(op1)
lib2 = Library(op2)
lib3 = Library(op3)

print( lib1.Op(2) )
print( lib2.Op(2) )
print( lib3.Op(2) )

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

1
ответ дан 4 December 2019 в 09:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: