The utility of the constants is to avoid having to know the actual internal value, since it might potentially change between releases. Best practice would be to simply compare the returned value with the constants, e.g.
attr_type = feature.getAttributeType('my_attribute')
if attr_type == fmeobjects.FME_ATTR_STRING:
# it's a string
elif attr_type == fmeobjects.FME_ATTR_INT64:
# it's a 64-bit integer (bigint)
That way your code automatically adapts even if, for some reason, the internal integer values associated with the constants should change.
The utility of the constants is to avoid having to know the actual internal value, since it might potentially change between releases. Best practice would be to simply compare the returned value with the constants, e.g.
attr_type = feature.getAttributeType('my_attribute')
if attr_type == fmeobjects.FME_ATTR_STRING:
# it's a string
elif attr_type == fmeobjects.FME_ATTR_INT64:
# it's a 64-bit integer (bigint)
That way your code automatically adapts even if, for some reason, the internal integer values associated with the constants should change.
Agree this is the right way when you want to perform different actions based on the data type, you should always compare to the defined constants, not their values.
My case was diagnostic, so knowing which constant the values represent (even if just in the context of the FME version) is very useful.
I usually won't know the data model my users are working with; and they are not software developers (Which is my background)
Agree this is the right way when you want to perform different actions based on the data type, you should always compare to the defined constants, not their values.
My case was diagnostic, so knowing which constant the values represent (even if just in the context of the FME version) is very useful.
I usually won't know the data model my users are working with; and they are not software developers (Which is my background)
You could always use some introspection to iterate over and print the values to the FME log from a PythonCaller, e.g.
import fmeobjects
def ListFmeDataTypeConsts(feature):
contents = dir(fmeobjects)
for obj in contents:
if obj.startswith('FME_ATTR'):
print('{} = {}'.format(obj, getattr(fmeobjects, obj)))
Output:
FME_ATTR_BOOLEAN = 1
FME_ATTR_ENCODED_STRING = 12
FME_ATTR_INT16 = 4
FME_ATTR_INT32 = 6
FME_ATTR_INT64 = 13
FME_ATTR_INT8 = 2
FME_ATTR_LIST = 4
FME_ATTR_REAL32 = 8
FME_ATTR_REAL64 = 9
FME_ATTR_REAL80 = 10
FME_ATTR_STRING = 11
FME_ATTR_UINT16 = 5
FME_ATTR_UINT32 = 7
FME_ATTR_UINT64 = 14
FME_ATTR_UINT8 = 3
FME_ATTR_UNDEFINED = 0
Agree this is the right way when you want to perform different actions based on the data type, you should always compare to the defined constants, not their values.
My case was diagnostic, so knowing which constant the values represent (even if just in the context of the FME version) is very useful.
I usually won't know the data model my users are working with; and they are not software developers (Which is my background)
Thank you, and a valuable bit of insight into Python possibilities too (My background is (/used to be) PHP and C# web application development)