FHIR Slicin utilities for Pydantic models
Project description
🔪 FHIR Slicing utilities for Pydantic
A Python library that simplifies working with nested elements in FHIR resources using Pydantic models and smart slicing.
🤔 The Challenge
Working with FHIR resources in Python can be challenging due to their complex structure and extensibility. FHIR resources often contain:
- Nested elements with cardinality
0..*or1..* - Extension arrays with unknown elements
This leads to verbose and error-prone code when accessing nested data:
# Traditional way to access birth place
birth_place = next(
(e.valueAddress.city
for e in patient.extension
if e.url == "http://hl7.org/fhir/StructureDefinition/patient-birthPlace"),
None
)
# Traditional way to access systolic blood pressure
bp_reading = observation.component[0].valueQuantity.value # Fragile! Assumes systolic is first
# or by code but not very readable
systolic = next(
(c.valueQuantity.value
for c in observation.component
if c.code.coding[0].code == "8480-6"),
None
)
✨ Solution: Smart Slicing
This library introduces a more intuitive way to access nested FHIR data using named slices, inspired by FHIR's slicing mechanism.
Known slices are defined as annotated fields in Pydantic models, which provide:
- ✅ Validation of slice cardinality
- 🛡️ Type safety for slice elements
- 📖 Improved readability
[!NOTE] Interested in how it works? Check out this blog post for more details.
Unkown elements are left untouched and the order of elements is preserved.
Example: Patient with birthPlace extension
from pydantic_fhir_slicing import Slice, ElementArray
from my_fhir_types import Address, BaseModel
class AddressExtension(BaseModel):
url: str
valueAddress: Address
class PatientExtensions(ElementArray):
birthPlace: AddressExtension = Slice(1, 1)
def discriminator(self, item) -> str:
url = item.get("url", None)
match url:
case "http://hl7.org/fhir/StructureDefinition/patient-birthPlace":
return "birthPlace"
case _:
return "@default"
class Patient(BaseModel):
extension: PatientExtensions
# Access known extensions by name, while preserving access to unknown ones
patient.extension.birthPlace.valueAddress.city
patient.extension[0] # Still works for accessing any extension
Example: Blood Pressure Observation with systolic and diastolic components
from pydantic_fhir_slicing import ElementArray
from my_fhir_types import CodeableConcept, Quantity, BaseModel
class QuantityComponent(BaseModel):
code: CodeableConcept
valueQuantity: Quantity
class BPComponents(ElementArray):
systolic: QuantityComponent = Slice(1, 1)
diastolic: QuantityComponent = Slice(1, 1)
def discriminator(self, item: Component) -> str:
try:
code = item["code"]["coding"][0]["code"]
match code:
case "8480-6":
return "systolic"
case "8462-4":
return "diastolic"
case _:
return "@default"
except (KeyError, IndexError):
return "@default"
class BloodPressureObservation(BaseModel):
code: CodeableConcept
component: BPComponents
# Access components naturally
bp = BloodPressureObservation.model_validate(data)
systolic = bp.component.systolic.valueQuantity.value
diastolic = bp.component.diastolic.valueQuantity.value
🚀 Installation (coming soon)
pip install pydantic-fhir-slicing
👥 Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
📜 License
MIT License
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file fhir_slicing-0.1.0.tar.gz.
File metadata
- Download URL: fhir_slicing-0.1.0.tar.gz
- Upload date:
- Size: 13.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.5.22
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c2d95cf05e74e41e37e72874621cf58e2b9320309d59ec87ba86a27b19ee9bc3
|
|
| MD5 |
93561083514ba9297caef6c3021f2b4c
|
|
| BLAKE2b-256 |
b6498b59b21382c00a06e82c64afa7a6380fe8675f777ec22919b99abb40e28d
|
File details
Details for the file fhir_slicing-0.1.0-py3-none-any.whl.
File metadata
- Download URL: fhir_slicing-0.1.0-py3-none-any.whl
- Upload date:
- Size: 7.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.5.22
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
df88a2ae9128b87744b3d32a105263d407167c2eafbef542b267e1f30189a1e1
|
|
| MD5 |
4ad4d78fa0d06d061938fe03beac6796
|
|
| BLAKE2b-256 |
07cad2274f1f623ad1ec76c250dc9991a14f88c4abed00c09e5a3bebdef79059
|