# Element VRs and Python types

DICOM elements can contain anything from ASCII strings to unicode text, decimals, floats, signed and unsigned integers of different byte-depth and even encoded data. The format of the value of an element is given by its Value Representation or VR, and a list of VRs is given in the DICOM Standard in Part 5, Table 6.2-1.

So when using pydicom, what Python type should be used with a given VR to ensure that the value gets written correctly?

- Elements of any VR:

  - Can be set as empty by using `None`

  - Can have their values set using their set using or stored as type from the table below

- Non-SQ element values:

  - Can also be set using a `list` of their set using type - for Value Multiplicity (VM) > 1, the value will be stored as a `MultiValue` of their stored as type

  - However, according to the DICOM Standard, elements with VR LT, OB, OD, OF, OL, OW, ST, UN, UR and UT should never have a VM greater than 1.

- SQ element values should be set using a `list` of zero or more `Dataset` instances.

VR | Name | Set using | Stored as (T) | Type hint for element value
--- | --- | --- | --- | ---
AE | Application Entity | `str` | `str` | Union[None, T, MutableSequence[T]]
AS | Age String | `str` | `str`
AT | Attribute Tag | Tag 1 | `BaseTag`
CS | Code String | `str` | `str`
DA | Date | `str` | `str` or `DA`2
DS | Decimal String | `str`, `float` or `int` | `DSfloat` or `DSdecimal`3
DT | Date Time | `str` | `str` or `DT`2
FL | Floating Point Single | `float` | `float`
FD | Floating Point Double | `float` | `float`
IS | Integer String | `str` or `int` | `IS`
LO | Long String | `str` | `str`
LT | Long Text | `str` | `str` | Optional[T]
OB | Other Byte | `bytes` | `bytes`
OD | Other Double | `bytes` | `bytes`
OF | Other Float | `bytes` | `bytes`
OL | Other Long | `bytes` | `bytes`
OV | Other 64-bit Very Long | `bytes` | `bytes`
OW | Other Word | `bytes` | `bytes`
PN | Person Name | `str` | `PersonName` | Union[None, T, MutableSequence[T]]
SH | Short String | `str` | `str`
SL | Signed Long | `int` | `int`
SQ | Sequence of Items | `list` | `Sequence` | MutableSequence[ `Dataset`]
SS | Signed Short | `int` | `int` | Union[None, T, MutableSequence[T]]
ST | Short Text | `str` | `str` | Optional[T]
SV | Signed 64-bit Very Long | `int` | `int` | Union[None, T, MutableSequence[T]]
TM | Time | `str` | `str` or `TM`2
UC | Unlimited Characters | `str` | `str`
UI | Unique Identifier (UID) | `str` | `UID`
UL | Unsigned Long | `int` | `int`
UN | Unknown | `bytes` | `bytes` | Optional[T]
UR | URI/URL | `str` | `str`
US | Unsigned Short | `int` | `int` | Union[None, T, MutableSequence[T]]
UT | Unlimited Text | `str` | `str` | Optional[T]
UV | Unsigned 64-bit Very Long | `int` | `int` | Union[None, T, MutableSequence[T]]

1 Any type accepted by `Tag()` can be used
2 If `config.datetime_conversion` = `True` (default `False`)
3 If `config.use_DS_decimal` = `True` (default `False`)