You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@beam.apache.org by "Chuan Yu Foo (JIRA)" <ji...@apache.org> on 2018/04/16 20:33:00 UTC

[jira] [Created] (BEAM-4091) Typehint annotations don't work with @ptrasnform_fn annotation

Chuan Yu Foo created BEAM-4091:
----------------------------------

             Summary: Typehint annotations don't work with @ptrasnform_fn annotation
                 Key: BEAM-4091
                 URL: https://issues.apache.org/jira/browse/BEAM-4091
             Project: Beam
          Issue Type: Bug
          Components: sdk-py-core
    Affects Versions: 2.4.0
            Reporter: Chuan Yu Foo
            Assignee: Ahmet Altay


Typehint annotations don't work with functions annotated with @ptransform_fn, but they do work with the equivalent classes.

The following is a minimal example illustrating this:

{code:python}
@beam.typehints.with_input_types(float)
@beam.typehints.with_output_types(bytes)
@beam.ptransform_fn
def _DoStuffFn(pcoll):
  return pcoll | 'TimesTwo' >> beam.Map(lambda x: x * 2)

@beam.typehints.with_input_types(float)
@beam.typehints.with_output_types(bytes)
class _DoStuffClass(beam.PTransform):

  def expand(self, pcoll):
    return pcoll | 'TimesTwo' >> beam.Map(lambda x: x * 2)
{code}

With definitions as above, the class correctly fails the typecheck:

{code:python}
def class_correctly_fails():
  p = beam.Pipeline(options=PipelineOptions(runtime_type_check=True))
  _ = (p
       | 'Create' >> beam.Create([1, 2, 3, 4, 5])
       | 'DoStuff1' >> _DoStuffClass()
       | 'DoStuff2' >> _DoStuffClass()
       | 'Write' >> beam.io.WriteToText('/tmp/output'))
  p.run().wait_until_finish()

# apache_beam.typehints.decorators.TypeCheckError: Input type hint violation at DoStuff1: expected <type 'float'>, got <type 'int'>
{code}

But the {{ptransform_fn}} incorrectly passes the typecheck:

{code:python}
def ptransform_incorrectly_passes():
  p = beam.Pipeline(options=PipelineOptions(runtime_type_check=True))
  _ = (p
       | 'Create' >> beam.Create([1, 2, 3, 4, 5])
       | 'DoStuff1' >> _DoStuffFn()
       | 'DoStuff2' >> _DoStuffFn()
       | 'Write' >> beam.io.WriteToText('/tmp/output'))
  p.run().wait_until_finish()
# No error
{code}




--
This message was sent by Atlassian JIRA
(v7.6.3#76005)