def render_row(num, columns, widths, column_colors=None):
row_str = '<STR_LIT:|>'<EOL>cell_strs = []<EOL>for i, column in enumerate(columns):<EOL><INDENT>try:<EOL><INDENT>cell = column[num]<EOL>spaces = '<STR_LIT:U+0020>' * (widths[i] - len(cell))<EOL>if column_colors is not None and column_colors[i] is not None:<EOL><INDENT>cell = column_colors[i](cell)<EOL><DEDENT>cell_strs.append('<STR_LIT>' % (cell, spaces))<EOL><DEDENT>except IndexError:<EOL><INDENT>cell_strs.append('<STR_LIT:U+0020>' * (widths[i] + <NUM_LIT:2>))<EOL><DEDENT><DEDENT>return '<STR_LIT>' % '<STR_LIT:|>'.join(cell_strs)<EOL>
Render the `num`th row of each column in `columns`.

:param num: Which row to render.
:type num: ``int``
:param columns: The list of columns.
:type columns: [[``str``]]
:param widths: The widths of each column.
:type widths: [``int``]
:param column_colors: An optional list of coloring functions.
:type column_colors: [``str`` -> ``str``] or ``NoneType``

:return: The rendered row.
:rtype: ``str``