def to_runner_api_parameter(self, unused_context):
     _args_schema = named_fields_to_schema([
         (f'arg{ix}', convert_to_typing_type(instance_to_type(value)))
         for (ix, value) in enumerate(self._args)
     ])
     _kwargs_schema = named_fields_to_schema([
         (key, convert_to_typing_type(instance_to_type(value)))
         for (key, value) in self._kwargs.items()
     ])
     payload_schema = named_fields_to_schema({
         'constructor': str,
         'args': _args_schema,
         'kwargs': _kwargs_schema,
     })
     return (PYTHON_FULLY_QUALIFIED_NAMED_TRANSFORM_URN,
             external_transforms_pb2.ExternalConfigurationPayload(
                 schema=payload_schema,
                 payload=coders.RowCoder(payload_schema).encode(
                     Row(constructor=self._constructor,
                         args=Row(
                             **{
                                 f'arg{ix}': arg
                                 for (ix, arg) in enumerate(self._args)
                             }),
                         kwargs=Row(**self._kwargs)), )))
 def from_runner_api_parameter(unused_ptransform, payload, unused_context):
     row = coders.RowCoder(payload.schema).decode(payload.payload)
     maybe_as_dict = lambda x: x._asdict() if x else {}
     return FullyQualifiedNamedTransform(
         row.constructor, tuple(getattr(row, 'args', ())),
         maybe_as_dict(getattr(row, 'kwargs', None)))