docstr: Display a radio button widget.
  
  Parameters
  ----------
  label : str
      A short label explaining to the user what this radio group is for.
      The label can optionally contain Markdown and supports the following
      elements: Bold, Italics, Strikethroughs, Inline Code, Emojis, and Links.
  
      This also supports:
  
      * Emoji shortcodes, such as ``:+1:``  and ``:sunglasses:``.
        For a list of all supported codes,
        see https://share.streamlit.io/streamlit/emoji-shortcodes.
  
      * LaTeX expressions, by wrapping them in "$" or "$$" (the "$$"
        must be on their own lines). Supported LaTeX functions are listed
        at https://katex.org/docs/supported.html.
  
      * Colored text, using the syntax ``:color[text to be colored]``,
        where ``color`` needs to be replaced with any of the following
        supported colors: blue, green, orange, red, violet, gray/grey, rainbow.
  
      Unsupported elements are unwrapped so only their children (text contents) render.
      Display unsupported elements as literal characters by
      backslash-escaping them. E.g. ``1\. Not an ordered list``.
  
      For accessibility reasons, you should never set an empty label (label="")
      but hide it with label_visibility if needed. In the future, we may disallow
      empty labels by raising an exception.
  options : Iterable
      Labels for the select options in an Iterable. For example, this can
      be a list, numpy.ndarray, pandas.Series, pandas.DataFrame, or
      pandas.Index. For pandas.DataFrame, the first column is used.
  
      Labels can include markdown as described in the ``label`` parameter
      and will be cast to str internally by default.
  index : int or None
      The index of the preselected option on first render. If ``None``,
      will initialize empty and return ``None`` until the user selects an option.
      Defaults to 0 (the first option).
  format_func : function
      Function to modify the display of radio options. It receives
      the raw option as an argument and should output the label to be
      shown for that option. This has no impact on the return value of
      the radio.
  key : str or int
      An optional string or integer to use as the unique key for the widget.
      If this is omitted, a key will be generated for the widget
      based on its content. Multiple widgets of the same type may
      not share the same key.
  help : str
      An optional tooltip that gets displayed next to the radio.
  on_change : callable
      An optional callback invoked when this radio's value changes.
  args : tuple
      An optional tuple of args to pass to the callback.
  kwargs : dict
      An optional dict of kwargs to pass to the callback.
  disabled : bool
      An optional boolean, which disables the radio button if set to
      True. The default is False.
  horizontal : bool
      An optional boolean, which orients the radio group horizontally.
      The default is false (vertical buttons).
  captions : iterable of str or None
      A list of captions to show below each radio button. If None (default),
      no captions are shown.
  label_visibility : "visible", "hidden", or "collapsed"
      The visibility of the label. If "hidden", the label doesn't show but there
      is still empty space for it above the widget (equivalent to label="").
      If "collapsed", both the label and the space are removed. Default is
      "visible".
  
  Returns
  -------
  any
      The selected option or ``None`` if no option is selected.
  
  Example
  -------
  >>> import streamlit as st
  >>>
  >>> genre = st.radio(
  ...     "What's your favorite movie genre",
  ...     [":rainbow[Comedy]", "***Drama***", "Documentary :movie_camera:"],
  ...     captions = ["Laugh out loud.", "Get the popcorn.", "Never stop learning."])
  >>>
  >>> if genre == ':rainbow[Comedy]':
  ...     st.write('You selected comedy.')
  ... else:
  ...     st.write("You didn\'t select comedy.")
  
  .. output::
     https://doc-radio.streamlit.app/
     height: 300px
  
  To initialize an empty radio widget, use ``None`` as the index value:
  
  >>> import streamlit as st
  >>>
  >>> genre = st.radio(
  ...     "What's your favorite movie genre",
  ...     [":rainbow[Comedy]", "***Drama***", "Documentary :movie_camera:"],
  ...     index=None,
  ... )
  >>>
  >>> st.write("You selected:", genre)
  
  .. output::
     https://doc-radio-empty.streamlit.app/
     height: 300px
docstr_tok: ["Display","a","radio","button","widget",".","Parameters","--","--","--","--","--","label",":","str","A","short","label","explaining","to","the","user","what","this","radio","group","is","for",".","The","label","can","optionally","contain","Markdown","and","supports","the","following","elements",":","Bold",",","Italics",",","Strikethroughs",",","Inline","Code",",","Emojis",",","and","Links",".","This","also","supports",":","*","Emoji","shortcodes",",","such","as","``",":","+1",":","``","and","``",":","sunglasses",":","``",".","For","a","list","of","all","supported","codes",",","see","https",":","\/\/share.streamlit.io\/streamlit\/emoji-shortcodes",".","*","LaTeX","expressions",",","by","wrapping","them","in","``","$","''","or","``","$","$","''","(","the","``","$","$","''","must","be","on","their","own","lines",")",".","Supported","LaTeX","functions","are","listed","at","https",":","\/\/katex.org\/docs\/supported.html",".","*","Colored","text",",","using","the","syntax","``",":","color","[","text","to","be","colored","]","``",",","where","``","color","``","needs","to","be","replaced","with","any","of","the","following","supported","colors",":","blue",",","green",",","orange",",","red",",","violet",",","gray\/grey",",","rainbow",".","Unsupported","elements","are","unwrapped","so","only","their","children","(","text","contents",")","render",".","Display","unsupported","elements","as","literal","characters","by","backslash-escaping","them",".","E.g",".","``","1\\",".","Not","an","ordered","list","``",".","For","accessibility","reasons",",","you","should","never","set","an","empty","label","(","label=","''","''",")","but","hide","it","with","label_visibility","if","needed",".","In","the","future",",","we","may","disallow","empty","labels","by","raising","an","exception",".","options",":","Iterable","Labels","for","the","select","options","in","an","Iterable",".","For","example",",","this","can","be","a","list",",","numpy.ndarray",",","pandas.Series",",","pandas.DataFrame",",","or","pandas.Index",".","For","pandas.DataFrame",",","the","first","column","is","used",".","Labels","can","include","markdown","as","described","in","the","``","label","``","parameter","and","will","be","cast","to","str","internally","by","default",".","index",":","int","or","None","The","index","of","the","preselected","option","on","first","render",".","If","``","None","``",",","will","initialize","empty","and","return","``","None","``","until","the","user","selects","an","option",".","Defaults","to","0","(","the","first","option",")",".","format_func",":","function","Function","to","modify","the","display","of","radio","options",".","It","receives","the","raw","option","as","an","argument","and","should","output","the","label","to","be","shown","for","that","option",".","This","has","no","impact","on","the","return","value","of","the","radio",".","key",":","str","or","int","An","optional","string","or","integer","to","use","as","the","unique","key","for","the","widget",".","If","this","is","omitted",",","a","key","will","be","generated","for","the","widget","based","on","its","content",".","Multiple","widgets","of","the","same","type","may","not","share","the","same","key",".","help",":","str","An","optional","tooltip","that","gets","displayed","next","to","the","radio",".","on_change",":","callable","An","optional","callback","invoked","when","this","radio","'s","value","changes",".","args",":","tuple","An","optional","tuple","of","args","to","pass","to","the","callback",".","kwargs",":","dict","An","optional","dict","of","kwargs","to","pass","to","the","callback",".","disabled",":","bool","An","optional","boolean",",","which","disables","the","radio","button","if","set","to","True",".","The","default","is","False",".","horizontal",":","bool","An","optional","boolean",",","which","orients","the","radio","group","horizontally",".","The","default","is","false","(","vertical","buttons",")",".","captions",":","iterable","of","str","or","None","A","list","of","captions","to","show","below","each","radio","button",".","If","None","(","default",")",",","no","captions","are","shown",".","label_visibility",":","``","visible","''",",","``","hidden","''",",","or","``","collapsed","''","The","visibility","of","the","label",".","If","``","hidden","''",",","the","label","does","n't","show","but","there","is","still","empty","space","for","it","above","the","widget","(","equivalent","to","label=","''","''",")",".","If","``","collapsed","''",",","both","the","label","and","the","space","are","removed",".","Default","is","``","visible","''",".","Returns","--","--","--","-","any","The","selected","option","or","``","None","``","if","no","option","is","selected",".","Example","--","--","--","-",">",">",">","import","streamlit","as","st",">",">",">",">",">",">","genre","=","st.radio","(","...","``","What","'s","your","favorite","movie","genre","''",",","...","[","``",":","rainbow","[","Comedy","]","''",",","``","*","*","*","Drama","*","*","*","''",",","``","Documentary",":","movie_camera",":","''","]",",","...","captions","=","[","``","Laugh","out","loud",".","``",",","``","Get","the","popcorn",".","``",",","``","Never","stop","learning",".","''","]",")",">",">",">",">",">",">","if","genre","==","'",":","rainbow","[","Comedy","]","'",":","...","st.write","(","'You","selected","comedy",".","'",")","...","else",":","...","st.write","(","``","You","didn\\'t","select","comedy",".","''",")","..","output",":",":","https",":","\/\/doc-radio.streamlit.app\/","height",":","300px","To","initialize","an","empty","radio","widget",",","use","``","None","``","as","the","index","value",":",">",">",">","import","streamlit","as","st",">",">",">",">",">",">","genre","=","st.radio","(","...","``","What","'s","your","favorite","movie","genre","''",",","...","[","``",":","rainbow","[","Comedy","]","''",",","``","*","*","*","Drama","*","*","*","''",",","``","Documentary",":","movie_camera",":","''","]",",","...","index=None",",","...",")",">",">",">",">",">",">","st.write","(","``","You","selected",":","''",",","genre",")","..","output",":",":","https",":","\/\/doc-radio-empty.streamlit.app\/","height",":","300px"]
code: def radio(
      self,
      label: str,
      options: OptionSequence[T],
      index: int | None = 0,
      format_func: Callable[[Any], Any] = str,
      key: Key | None = None,
      help: str | None = None,
      on_change: WidgetCallback | None = None,
      args: WidgetArgs | None = None,
      kwargs: WidgetKwargs | None = None,
      *,  # keyword-only args:
      disabled: bool = False,
      horizontal: bool = False,
      captions: Sequence[str] | None = None,
      label_visibility: LabelVisibility = "visible",
  ) -> T | None:
      r"""Display a radio button widget.
  
      Parameters
      ----------
      label : str
          A short label explaining to the user what this radio group is for.
          The label can optionally contain Markdown and supports the following
          elements: Bold, Italics, Strikethroughs, Inline Code, Emojis, and Links.
  
          This also supports:
  
          * Emoji shortcodes, such as ``:+1:``  and ``:sunglasses:``.
            For a list of all supported codes,
            see https://share.streamlit.io/streamlit/emoji-shortcodes.
  
          * LaTeX expressions, by wrapping them in "$" or "$$" (the "$$"
            must be on their own lines). Supported LaTeX functions are listed
            at https://katex.org/docs/supported.html.
  
          * Colored text, using the syntax ``:color[text to be colored]``,
            where ``color`` needs to be replaced with any of the following
            supported colors: blue, green, orange, red, violet, gray/grey, rainbow.
  
          Unsupported elements are unwrapped so only their children (text contents) render.
          Display unsupported elements as literal characters by
          backslash-escaping them. E.g. ``1\. Not an ordered list``.
  
          For accessibility reasons, you should never set an empty label (label="")
          but hide it with label_visibility if needed. In the future, we may disallow
          empty labels by raising an exception.
      options : Iterable
          Labels for the select options in an Iterable. For example, this can
          be a list, numpy.ndarray, pandas.Series, pandas.DataFrame, or
          pandas.Index. For pandas.DataFrame, the first column is used.
  
          Labels can include markdown as described in the ``label`` parameter
          and will be cast to str internally by default.
      index : int or None
          The index of the preselected option on first render. If ``None``,
          will initialize empty and return ``None`` until the user selects an option.
          Defaults to 0 (the first option).
      format_func : function
          Function to modify the display of radio options. It receives
          the raw option as an argument and should output the label to be
          shown for that option. This has no impact on the return value of
          the radio.
      key : str or int
          An optional string or integer to use as the unique key for the widget.
          If this is omitted, a key will be generated for the widget
          based on its content. Multiple widgets of the same type may
          not share the same key.
      help : str
          An optional tooltip that gets displayed next to the radio.
      on_change : callable
          An optional callback invoked when this radio's value changes.
      args : tuple
          An optional tuple of args to pass to the callback.
      kwargs : dict
          An optional dict of kwargs to pass to the callback.
      disabled : bool
          An optional boolean, which disables the radio button if set to
          True. The default is False.
      horizontal : bool
          An optional boolean, which orients the radio group horizontally.
          The default is false (vertical buttons).
      captions : iterable of str or None
          A list of captions to show below each radio button. If None (default),
          no captions are shown.
      label_visibility : "visible", "hidden", or "collapsed"
          The visibility of the label. If "hidden", the label doesn't show but there
          is still empty space for it above the widget (equivalent to label="").
          If "collapsed", both the label and the space are removed. Default is
          "visible".
  
      Returns
      -------
      any
          The selected option or ``None`` if no option is selected.
  
      Example
      -------
      >>> import streamlit as st
      >>>
      >>> genre = st.radio(
      ...     "What's your favorite movie genre",
      ...     [":rainbow[Comedy]", "***Drama***", "Documentary :movie_camera:"],
      ...     captions = ["Laugh out loud.", "Get the popcorn.", "Never stop learning."])
      >>>
      >>> if genre == ':rainbow[Comedy]':
      ...     st.write('You selected comedy.')
      ... else:
      ...     st.write("You didn\'t select comedy.")
  
      .. output::
         https://doc-radio.streamlit.app/
         height: 300px
  
      To initialize an empty radio widget, use ``None`` as the index value:
  
      >>> import streamlit as st
      >>>
      >>> genre = st.radio(
      ...     "What's your favorite movie genre",
      ...     [":rainbow[Comedy]", "***Drama***", "Documentary :movie_camera:"],
      ...     index=None,
      ... )
      >>>
      >>> st.write("You selected:", genre)
  
      .. output::
         https://doc-radio-empty.streamlit.app/
         height: 300px
  
      """
      ctx = get_script_run_ctx()
      return self._radio(
          label=label,
          options=options,
          index=index,
          format_func=format_func,
          key=key,
          help=help,
          on_change=on_change,
          args=args,
          kwargs=kwargs,
          disabled=disabled,
          horizontal=horizontal,
          captions=captions,
          label_visibility=label_visibility,
          ctx=ctx,
      )
  
imports: from __future__ import annotations
  from dataclasses import dataclass
  from textwrap import dedent
  from typing import TYPE_CHECKING, Any, Callable, Generic, Sequence, cast
  from streamlit.elements.form import current_form_id
  from streamlit.elements.utils import check_callback_rules, check_session_state_rules, get_label_visibility_proto_value, maybe_coerce_enum
  from streamlit.errors import StreamlitAPIException
  from streamlit.proto.Radio_pb2 import Radio
  from streamlit.runtime.metrics_util import gather_metrics
  from streamlit.runtime.scriptrunner import ScriptRunContext, get_script_run_ctx
  from streamlit.runtime.state import WidgetArgs, WidgetCallback, WidgetKwargs, register_widget
  from streamlit.runtime.state.common import compute_widget_id
  from streamlit.type_util import Key, LabelVisibility, OptionSequence, T, check_python_comparable, ensure_indexable, maybe_raise_label_warnings, to_key
  from streamlit.util import index_
label_desc: Use image node_id 1 for calling the RadioMixin obj's underlying member method code with example usage: obj.radio(label, options, index, format_func, key, help, on_change, args, kwargs) and returns: self