Проверьте это ... не используя пакет.
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)
Нет никакой потребности в лямбде вообще. лямбда является просто синтетическим сахаром, чтобы определить функцию и использовать его одновременно. Точно так же, как любой вызов лямбды может быть заменен явным определением, мы можем решить Вашу проблему путем создания реального класса, который удовлетворяет потребности и возврат его.
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)
Библиотека действительно указывает, что хочет "неинициализированную версию" (т.е. ссылка класса)?
Это смотрит на меня, как будто библиотека на самом деле хочет объектную фабрику. В этом случае приемлемо ввести:
lib3 = Library(lambda: Multiply(5))
Чтобы понять, как лямбда работает, рассмотрите следующее:
Multiply5 = lambda: Multiply(5)
assert Multiply5().run(3) == Multiply(5).run(3)
Это - вид обмана, но Вы могли дать Ваш Умножать класс 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__()
который возвращает объект, Вы хотите.
def mult(x):
def f():
return Multiply(x)
return f
op3 = mult(5)
lib3 = Library(op3)
print lib3.Op(2)
Если я понимаю Ваше пространство задач правильно, у Вас есть общий интерфейс, который берет 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) )
Однако изменение Библиотеки для взятия функции и затем обеспечение функций являются, вероятно, более сильным способом сделать это.