В приведенном ниже коде я могу получить имя класса через:
s.__class__.__name__ #Seq
, но я не могу получить имя экземпляра "s" напрямую, это будет проблемой, если я использую eval () в:
eval(s."head(20).tail(10)") # must be eval("s.head(20).tail(10)")
И
def foo(i_cls):
eval(i_cls."head(20).tail(10)")
Как?
Код
class Seq(object):
def __init__(self, seq):
self.seq = seq
self.name = "" **#EDIT**
def __repr__(self):
return repr(self.seq)
def __str__(self):
return str(self.seq)
def all(self):
return Seq(self.seq[:])
def head(self, count):
return Seq(self.seq[:count])
def tail(self, count):
return Seq(self.seq[-count:])
s = Seq(range(0, 100))
print s.head(20).tail(10) # "Method chain" invoking, work as linux command:
# seq 0 100 | head -20 | tail -10
РЕДАКТИРОВАТЬ: для того, чтобы eval (), я определилнижеприведенная функция может работать.
def cls_name_eval(i_cls, eval_str, eval_name = "i_cls"):
i_cls.name = eval_name
eval_str = i_cls.name + "." + eval_str #i_cls.head(20).tail(10)
return i_cls, eval_str
i_cls, eval_str = cls_name_eval(s, "head(20).tail(10)")
eval(eval_str)
или
def cls_name_eval(i_cls, eval_str, eval_name = "i_cls"):
i_cls.name = eval_name
eval_str = i_cls.name + "." + eval_str
#print i_cls.head(20).tail(10) #i_cls.head(20).tail(10), will not working, must print?
return eval(eval_str)
print cls_name_eval(s, "head(20).tail(10)")
v = Seq(range(44, 200))
print cls_name_eval(v, "head(20).tail(10)")
*** Remote Interpreter Reinitialized ***
>>>
[9, 5, 1]
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
[54, 55, 56, 57, 58, 59, 60, 61, 62, 63]