Как получить имя экземпляра класса или правильный формат для eval (class_instance. «Func1 (). Func2 ()») в Python?

1

В приведенном ниже коде я могу получить имя класса через:

s.__class__.__name__   #Seq

но я не могу получить имя ints напрямую, это будет проблемой, если я использую 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

EDIT: для 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]
Теги:
eval
instance
parameters

1 ответ

1
Лучший ответ

Если вы хотите отфильтровать все экземпляры класса A, а затем оценить call func_foo for them, то вы также можете использовать код Ignacio с небольшим добавлением:

map(lambda inst: getattr(inst, 'func_foo')(), filter(lambda x: isinstance(x, A), locals().values()))

Прошу прощения, если он повторяется.

Редакция:

l = locals()
instanceNames = filter(lambda x: isinstance(l[x], Seq), l)# gives you all Seq instances names
map(lambda inst: eval(inst+'.head(20).tail(10)'), filter(lambda x: isinstance(l[x], Seq), l))

ИЛИ

instName = 'tst'
exec('%s = Seq(%s)'% (instName, str(range(100))))
eval('%s.head(20).tail(10)' % variable)
  • 0
    @Artsiom, спасибо за твой код, но я думаю, что твой код будет применен ко всем экземплярам Seq, но мне нужен только один экземпляр, скажем "s". любой комментарий?
  • 0
    instanceNames содержит имена для всех экземпляров Seq, поэтому вы можете использовать как один, так и все. Вероятно, я не мог получить то, что вам действительно нужно. Не могли бы вы сказать мне, что у вас есть, так что у меня будет возможность понять, как справиться с такой информацией.
Показать ещё 8 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню