Я думаю, что вам нужно захватить регулярное выражение @
+ буквы / цифры / подчеркивание, которое равно "@(\w+)
(соответствует @
, затем 1 или более букве / цифре / подчеркиванию и создать группу с ними), поданным на функция замены
import re
mydict = {'Cost1' : 10, 'Cost2' : 5, 'Cost3' : 1, 'Revenue1' : 10}
string = '@Cost1 + (@Cost2 + @Cost3) / @Revenue1 * 1.2'
expression = re.sub("@(\w+)",lambda m : str(mydict.get(m.group(1),0)),string)
результат:
'10 + (5 + 1) / 10 * 1.2'
Этот метод очень эффективен, потому что он использует поиск в словаре вместо циклических, чтобы заменить и создать столько строк как есть переменные.
обратите внимание, что любая неизвестная переменная выдает 0. Если вы не хотите, чтобы это использовалось, используйте mydict[m.group(1)]
, чтобы вызвать ошибку ключа.
lambda
также не является обязательным. Вместо этого вы можете написать реальную функцию, если она принимает объект match
в качестве входных данных и возвращает строку в качестве выходных данных:
def repfunc(m)
return str(mydict.get(m.group(1),0))
re.sub("@(\w+)",repfunc,string)
(поэтому мы конвертируем в строку после получения значения)
Если у вас есть это выражение, вы можете применить оценщик (eval
является самым простым, но менее безопасным, ast.literal_eval
не будет работать, потому что он не поддерживает операции, но есть и другие, например, [ 1111] сторонний модуль (которому можно подать список переменных, который еще больше упростит ответ), или другие примеры здесь: Оценка математического выражения в строке )
Как насчет
union {
struct {
int x;
int y;
};
int v[2];
};
править:
union a {
struct b { int first, second; } bee;
int v[2];
};
Ужасный, но это более точно
Так как Вы используете C++ и не C, и так как они имеют те же типы, почему не только делают x ссылкой на v [0] и y ссылка на v[1]
Попробуйте это:
template<class T>
struct U1
{
U1();
T v[2];
T& x;
T& y;
};
template<class T>
U1<T>::U1()
:x(v[0])
,y(v[1])
{}
int main()
{
U1<int> data;
data.x = 1;
data.y = 2;
}
В зависимости от того, каков "Скаляр", да, можно сделать это в C++. Синтаксис почти точно (возможно, даже точно точно, но я ржав на объединениях), что Вы записали в своем примере. Это совпадает с C, кроме существуют ограничения на типы, которые могут быть в объединениях (IIRC, у них должен быть конструктор по умолчанию). Вот соответствующая статья Wikipedia.