LINUX.ORG.RU

Вопрос про Python

 


0

1

До этого момента на сабже не писал... Как в python покрасивше сделать dataflow?
Идеал:

> id = '424242'
> target = 'id' + id
> target
'id424242'
id = '484848'
> target
'id484848'
Переменных много, как минимум нужно, чтобы обращение к переменным выглядело одинаково.

Ответ на: комментарий от aedeph_

Не понял, как. И в любом случае, ведь в Python для обращении к функции нужно скобки написать, нет?

nei8Adai
() автор топика

Невнятное задание. Можно уточнить?

Virtuos86 ★★★★★
()

Жуткий концепт:

class Var(object):
    def __init__(self, value):
        self.value = value

    def __radd__(self, value):
        return Expr(value.__add__, self)

    def eval(self):
        if isinstance(self.value, (Var, Expr)):
            return self.value.eval()
        else:
            return self.value

    def __repr__(self):
        return self.eval()

class Expr(object):
    def __init__(self, op, value):
        self.op = op
        self.value = value

    def eval(self):
        if isinstance(self.value, (Var, Expr)):
            value = self.value.eval()
        else:
            value = self.value

        return self.op(value)

    def __repr__(self):
        return self.eval()

class DFlow(object):
    def __init__(self):
        self._data = {}

    def __setattr__(self, name, value):
        try:
            var = self.__dict__[name]
        except KeyError:
            self.__dict__[name] = Var(value)
        else:
            var.value = value

flow = DFlow()
flow.id = '424242'

flow.target = 'id' + flow.id
print flow.target

flow.id = '484848'
print flow.target

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

baverman ★★★
()
Ответ на: комментарий от baverman

Зачем так много букв???

$ python
Python 2.6.6 (r266:84292, Dec 26 2010, 22:31:48) 
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> class target :
...    def __repr__(self) : return 'id'+id
... 
>>> target = target()
>>> id = '123456'
>>> target
id123456
>>> id = '6769697'
>>> target
id6769697
>>> 

AIv ★★★★★
()
Ответ на: комментарий от AIv

Зачем так много букв???

target2 = target + 'onemoretime'
target = 'boo'
print target2

Хотя мои буквы сейчас тоже так не смогут, но это дописывается.

baverman ★★★
()
Ответ на: комментарий от AIv

Апгрейд, теперь ромашковый.

import operator

def dereference(obj):
    if isinstance(obj, (Var, Expr)):
        return obj.eval()
    else:
        return obj

class Base(object):
    def __add__(self, value):
        return Expr(operator.add, self, value)

    def __radd__(self, value):
        return Expr(operator.add, value, self)

    def eval(self):
        return dereference(self.value)

    def __repr__(self):
        return self.eval()

class Var(Base):
    def __init__(self, value):
        self.value = value

class Expr(Base):
    def __init__(self, op, left, right):
        self.op = op
        self.left = left
        self.right = right

    def eval(self):
        return dereference(self.op(dereference(self.left), dereference(self.right)))

class DFlow(object):
    def __init__(self):
        self._data = {}

    def __setattr__(self, name, value):
        try:
            var = self.__dict__[name]
        except KeyError:
            self.__dict__[name] = Var(value)
        else:
            var.value = value

flow = DFlow()
flow.id = '424242'

flow.target = 'id' + flow.id + flow.id
print flow.target

flow.target2 = flow.target + 'onemoretime'
flow.id = 'foo'
print flow.target2

flow.target = 'boo'
print flow.target2
baverman ★★★
()
Ответ на: комментарий от baverman

Ага, сразу как-то вспоминается беседа с неизвестным консультантом по черной магии.

dave ★★★★★
()
Ответ на: комментарий от anonymous

Ну и уродец этот ваш пистон

Да. Слава богу, такой код редко приходиться читать и совсем редко писать.

baverman ★★★
()

Я просто оставлю это здесь:

q)id:"424242"
q)target::"id",id
q)target
"id424242"
q)id:"484848"
q)target
"id484848"
anonymous
()
ActivePython 2.7.1.3 (ActiveState Software Inc.) based on
Python 2.7.1 (r271:86832, Dec  5 2010, 12:04:08) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> class foo(object):
    def __get(self): return 'id' + str(id)
    def __set(self, obj): pass
    target = property(__get, __set)

    
>>> foo = foo()
>>> foo.target
'id<built-in function id>' # к слову, об удачности выбора идентификатора 'id'
>>> id = 22222
>>> foo.target
'id22222'
>>> foo.target = 2323
>>> foo.target
'id22222'
>>> 

on win32

какой комп под рукой оказался, тем и воспользовался :)

Virtuos86 ★★★★★
()

Или так

ActivePython 2.7.1.3 (ActiveState Software Inc.) based on
Python 2.7.1 (r271:86832, Dec  5 2010, 12:04:08) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> class foo(object):
    def __init__(self, id):
        self.id = id
    def __get(self):
        return 'id' + str(self.id)
    def __set(self, obj):
        pass
    target = property(__get, __set)

    
>>> x = foo(335)
>>> y = foo(5365)
>>> x.target, y.target
('id335', 'id5365')
>>>

Virtuos86 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.