变量元素

变量元素是对变量API的二次封装,提供比底层API更加符合使用习惯的函数。

对于已经存在于系统中的变量元素,可以对其变量和值进行增改操作。

实例化变量

例如系统中存在 test_val 变量元素,于 /test 目录下:

1f8e372f5cbf48d99af182c5cfd10c9f

[2]:
from deepfos.element.variable import Variable

variable = Variable(element_name='test_val', path='/test')

查询变量值

使用get方法

[3]:
variable.get('test_global_text')
[3]:
'abcd'

如果变量不存在,默认返回None

[4]:
val = variable.get('not_existed')
val is None
[4]:
True

也可传入default值指定变量不存在时的返回值

[5]:
variable.get('not_existed', default='custom value')
[5]:
'custom value'

get方法能够根据设置的变量成员类型自动转换变量值

[6]:
variable.get('test_user_date')
[6]:
Timestamp('2021-01-02 03:04:05')
[7]:
num = variable.get('test_user_num')
num, type(num)
[7]:
(999.0, float)
[8]:
variable.get('test_user_customlist')
[8]:
['1', '3', '4']

说明

get 方法的取值逻辑默认为:全局变量时即为变量的值,用户变量时即为自定义值。 如果想对取值逻辑有更多的控制,可以使用 get_value 方法

使用get_value方法

get_value方法也可以获取变量的值,与get类似,但是在变量不存在时会抛出KeyError,可以提供default参数作为变量不存在的默认值。

相较于get方法,get_value对取值逻辑提供更多控制。提供 is_customize_value 参数,在取用户变量时,可以以此区分取默认值还是自定义值

[9]:
variable.get_value(name='test_user_num', is_customize_value=False)
[9]:
2233.0

查询变量

如果需要查询的不仅是变量值,而是变量本身(包含变量配置等),可以使用get_variable

[10]:
variable.get_variable('test_user_customlist')
[10]:
VariableValueDTO(description={}, dimensionMemberList=None, languageKey='uniqueKey5', name='test_user_customlist', relationKey=None, role=None, roleGroup=None, roleScript=None, rsDimension=None, rsElementDetail=None, rsMapping=None, rsName=None, rsRelationKey=None, scope=2, status=True, type=None, userValue='1,3,4', userValueDesc='', value=None, valueDesc='', valueType=13, valueTypeMap=ValueTypeMapDTO(decimalDisplayLength=None, defaultValue=None, defaultValueShow=None, digitLen=None, dimensionDisplay=None, dimensionName=None, displayDigitLen=None, elementDetail=None, enableDimensionExpression=None, functionCode=None, instruction=None, length=None, maxEqual=None, maxLen=None, maximun=None, minEqual=None, minimun=None, multiLevel=None, multipleChoiceLimit=None, multipleLevelInfo=None, percentage=None, selectMulti=None, selectedMulti=False, thousandthSymbol=None, treeView=None, valueField=None, valueKey='1,2,3,4', valueType=13))

遍历变量

variables 属性返回一个python字典,包含当前变量元素中的所有变量,以变量名为键,内容为值。

[11]:
list(variable.variables.keys())
[11]:
['test_global_text',
 'test_global_num',
 'test_global_dim',
 'test_user_date',
 'test_user_customlist',
 'test_user_text',
 'test_user_num']
[12]:
variable.variables['test_global_text']
[12]:
VariableValueDTO(description={}, dimensionMemberList=None, languageKey='uniqueKey1', name='test_global_text', relationKey=None, role=None, roleGroup=None, roleScript=None, rsDimension=None, rsElementDetail=None, rsMapping=None, rsName=None, rsRelationKey=None, scope=1, status=True, type=None, userValue=None, userValueDesc='', value='abcd', valueDesc='', valueType=1, valueTypeMap=ValueTypeMapDTO(decimalDisplayLength=None, defaultValue=None, defaultValueShow=None, digitLen=None, dimensionDisplay=None, dimensionName=None, displayDigitLen=None, elementDetail=None, enableDimensionExpression=None, functionCode=None, instruction=None, length=24, maxEqual=None, maxLen=None, maximun=None, minEqual=None, minimun=None, multiLevel=None, multipleChoiceLimit=None, multipleLevelInfo=None, percentage=None, selectMulti=None, selectedMulti=None, thousandthSymbol=None, treeView=None, valueField=None, valueKey='1', valueType=1))

变量元素定义了 __contains__ , 可以使用 in 判断某个变量名是否存在

[13]:
'test_global_text' in variable
[13]:
True
[14]:
'not_existed' in variable
[14]:
False

删除

使用delete_variables方法可以删除变量成员,但是删除并不会立即生效,需要调用``save``方法

[15]:
variable.delete_variables('test_global_num')

要一次删除多个成员,可以传入多个变量成员名

[16]:
variable.delete_variables('test_global_text', 'test_user_date')

清空所有成员

[17]:
variable.delete_variables(*variable.variables.keys())

保存修改结果

[18]:
variable.save()

变量成员已被清空:

2f44a9f3e674451698ea875da3037363

新增

add_xxx 方法可以在当前变量元素中增加变量

说明

区分了不同的变量类型,除了定义变量类型所必须的信息为必填参数外,其余都有默认值

定义时默认为当前用户的用户变量,支持在增加变量时赋值,默认为自定义值,可以通过 is_globalis_customize_value 参数更改

目前支持的变量类型:

  • add_text : 新增单个文本变量

  • add_number : 新增单个数字变量

  • add_sml : 新增单个值列表变量

  • add_dim : 新增单个维度变量

  • add_date : 新增单个日期变量

  • add_customlist : 新增单个自定义列表变量

增加一个长度为24的文字全局变量test_global_text,并赋值abcd

[19]:
variable.add_text(
    name='test_global_text',
    value='abcd',
    is_global=True,
    length=24
)

增加一个数字类型的全局变量test_global_num,整数长度8,小数长度2,并赋值1123

[20]:
variable.add_number(
    name='test_global_num',
    value=1123,
    is_global=True,
    int_length=8,
    digit_length=2
)

增加维度类型的变量时,需要提供所用的维度对象

[21]:
# 实例化维度test_dim
from deepfos.element.dimension import Dimension
Dim = Dimension(element_name='test_dim')

# 增加一个维度全局变量test_global_dim,并定义维度表达式(必填)
variable.add_dimension(
    name='test_global_dim',
    dim=Dim,
    dim_expression='test_dim{IDescendant(#root,0)}',
    is_global=True
)

增加一个年份格式的日期类型的用户自定义变量

[22]:
# 此处建议使用枚举类DateType,该枚举类提供了不同年月日格式的字符串,具可读性
from deepfos.element.variable import DateType
variable.add_date(
    name='test_user_date',
    date_format=DateType.year_month_day_time
)

增加一个自定义列表类型的用户自定义变量

[23]:
variable.add_custom_list(
    name='test_user_customlist',
    custom_list=list('1234')
)

增加一个文字用户自定义变量test_user_text,并赋值

[24]:
variable.add_text(
    name='test_user_text',
    value='text_value',
    is_customize_value=True
)

增加一个数字类型的用户默认变量,并赋值2233

[25]:
variable.add_number(
    name='test_user_num',
    value='2233',
    is_customize_value=False
)

保存后生效

[26]:
variable.save()

新增成员结果如图:

6998349e86424130b27806d35d7d92cb

更新

更新变量值

update_value 能够更新变量值

[27]:
import pandas as pd

variable['test_user_date'] = pd.to_datetime('2021-01-02 03:04:05')
variable.update_value(name='test_user_num', update_value=999)
variable.update_value(
    name='test_user_customlist',
    update_value=['1', '3', '4']
)
variable.update_value(
    name='test_user_date',
    update_value=pd.to_datetime('2022-03-04 05:06:07'),
    is_customize_value=False
)

也可以使用__setitem__方法更新,对于用户变量,会默认更新自定义值

[28]:
variable['test_user_date'] = pd.to_datetime('2021-01-02 03:04:05')

调用save方法使更改生效

[29]:
variable.save()

更新结果如图:

ec5f0755a1f249fc9f67eacfd3b5607a

更新变量描述

update_description 方法可以更新指定变量的描述

[30]:
variable.update_description(
    name='test_user_text',
    en_description="test english description",
    zh_cn_description="测试中文描述"
)

调用save方法使更改生效

[31]:
variable.save()

当前变量元素界面呈现:

2be42d641aa44ebd86eb799bb5d97e68