I am having a hard time with code re-use in Panel. Consider the following trivial example has a repeated pane (info_card) of employee information per employee. Additionally, I have a global widget (date_widget) on which all employee cards rely. The only difference between info_card1 and info_card2 is static information about the specific employee.
import panel as pn
pn.extension()
import datetime as dt
# Global Widget
date_widget = pn.widgets.DatePicker(name='Pick a day', value=dt.date.today())
@pn.depends(date_widget.param.value)
def info_card1(date_widget):
# The only difference between info_cards is this static info
name='John'
sex='M'
bday=dt.date(2021,5,1)
# Component Specific widget
show_gender = pn.widgets.Checkbox(name='Show Gender', value=False)
# Component Specific Display
@pn.depends(show_gender.param.value)
def display(gender):
return pn.Card(
f'Name: {name}',
f'Next Birthday: {(bday - date_widget).days} days',
f'Gender: {sex if gender else "X"}',
show_gender)
return display
@pn.depends(date_widget.param.value)
def info_card2(date_widget):
# The only difference between info_cards is this static info
name='Chelsea'
sex='F'
bday=dt.date(2021,7,21)
# Component Specific widget
show_gender = pn.widgets.Checkbox(name='Show Gender', value=False)
# Component Specific Display
@pn.depends(show_gender.param.value)
def display(gender):
return pn.Card(
f'Name: {name}',
f'Next Birthday: {(bday - date_widget).days} days',
f'Gender: {sex if gender else "X"}',
show_gender)
return display
# Global display
pn.Column(
pn.Row('Global Widget:', date_widget),
pn.Row(info_card1, info_card2)
).servable()
Clearly, this solution is wanting for some code re-use. What is the best way to to consolidate the info_pane
into a single reusable component?