blob: b481bc62c81d1cf1934b9a44b4377ad47fed1663 [file] [log] [blame]
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>apache_beam.typehints.schemas &mdash; Apache Beam 2.38.0 documentation</title>
<script type="text/javascript" src="../../../_static/js/modernizr.min.js"></script>
<script type="text/javascript" id="documentation_options" data-url_root="../../../" src="../../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../../_static/jquery.js"></script>
<script type="text/javascript" src="../../../_static/underscore.js"></script>
<script type="text/javascript" src="../../../_static/doctools.js"></script>
<script type="text/javascript" src="../../../_static/language_data.js"></script>
<script async="async" type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/latest.js?config=TeX-AMS-MML_HTMLorMML"></script>
<script type="text/javascript" src="../../../_static/js/theme.js"></script>
<link rel="stylesheet" href="../../../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
<link rel="index" title="Index" href="../../../genindex.html" />
<link rel="search" title="Search" href="../../../search.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="../../../index.html" class="icon icon-home"> Apache Beam
</a>
<div class="version">
2.38.0
</div>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../../../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../../apache_beam.coders.html">apache_beam.coders package</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../apache_beam.dataframe.html">apache_beam.dataframe package</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../apache_beam.io.html">apache_beam.io package</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../apache_beam.metrics.html">apache_beam.metrics package</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../apache_beam.ml.html">apache_beam.ml package</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../apache_beam.options.html">apache_beam.options package</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../apache_beam.portability.html">apache_beam.portability package</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../apache_beam.runners.html">apache_beam.runners package</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../apache_beam.transforms.html">apache_beam.transforms package</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../apache_beam.typehints.html">apache_beam.typehints package</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../apache_beam.utils.html">apache_beam.utils package</a></li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../../apache_beam.error.html">apache_beam.error module</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../apache_beam.pipeline.html">apache_beam.pipeline module</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../apache_beam.pvalue.html">apache_beam.pvalue module</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../../../index.html">Apache Beam</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="../../../index.html">Docs</a> &raquo;</li>
<li><a href="../../index.html">Module code</a> &raquo;</li>
<li>apache_beam.typehints.schemas</li>
<li class="wy-breadcrumbs-aside">
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<h1>Source code for apache_beam.typehints.schemas</h1><div class="highlight"><pre>
<span></span><span class="c1">#</span>
<span class="c1"># Licensed to the Apache Software Foundation (ASF) under one or more</span>
<span class="c1"># contributor license agreements. See the NOTICE file distributed with</span>
<span class="c1"># this work for additional information regarding copyright ownership.</span>
<span class="c1"># The ASF licenses this file to You under the Apache License, Version 2.0</span>
<span class="c1"># (the &quot;License&quot;); you may not use this file except in compliance with</span>
<span class="c1"># the License. You may obtain a copy of the License at</span>
<span class="c1">#</span>
<span class="c1"># http://www.apache.org/licenses/LICENSE-2.0</span>
<span class="c1">#</span>
<span class="c1"># Unless required by applicable law or agreed to in writing, software</span>
<span class="c1"># distributed under the License is distributed on an &quot;AS IS&quot; BASIS,</span>
<span class="c1"># WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span>
<span class="c1"># See the License for the specific language governing permissions and</span>
<span class="c1"># limitations under the License.</span>
<span class="c1">#</span>
<span class="sd">&quot;&quot;&quot; Support for mapping python types to proto Schemas and back again.</span>
<span class="sd">Imposes a mapping between common Python types and Beam portable schemas</span>
<span class="sd">(https://s.apache.org/beam-schemas)::</span>
<span class="sd"> Python Schema</span>
<span class="sd"> np.int8 &lt;-----&gt; BYTE</span>
<span class="sd"> np.int16 &lt;-----&gt; INT16</span>
<span class="sd"> np.int32 &lt;-----&gt; INT32</span>
<span class="sd"> np.int64 &lt;-----&gt; INT64</span>
<span class="sd"> int ------&gt; INT64</span>
<span class="sd"> np.float32 &lt;-----&gt; FLOAT</span>
<span class="sd"> np.float64 &lt;-----&gt; DOUBLE</span>
<span class="sd"> float ------&gt; DOUBLE</span>
<span class="sd"> bool &lt;-----&gt; BOOLEAN</span>
<span class="sd"> str &lt;-----&gt; STRING</span>
<span class="sd"> bytes &lt;-----&gt; BYTES</span>
<span class="sd"> ByteString ------&gt; BYTES</span>
<span class="sd"> Timestamp &lt;-----&gt; LogicalType(urn=&quot;beam:logical_type:micros_instant:v1&quot;)</span>
<span class="sd"> Mapping &lt;-----&gt; MapType</span>
<span class="sd"> Sequence &lt;-----&gt; ArrayType</span>
<span class="sd"> NamedTuple &lt;-----&gt; RowType</span>
<span class="sd"> beam.Row ------&gt; RowType</span>
<span class="sd">Note that some of these mappings are provided as conveniences,</span>
<span class="sd">but they are lossy and will not survive a roundtrip from python to Beam schemas</span>
<span class="sd">and back. For example, the Python type :code:`int` will map to :code:`INT64` in</span>
<span class="sd">Beam schemas but converting that back to a Python type will yield</span>
<span class="sd">:code:`np.int64`.</span>
<span class="sd">:code:`nullable=True` on a Beam :code:`FieldType` is represented in Python by</span>
<span class="sd">wrapping the type in :code:`Optional`.</span>
<span class="sd">This module is intended for internal use only. Nothing defined here provides</span>
<span class="sd">any backwards-compatibility guarantee.</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="c1"># pytype: skip-file</span>
<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">Any</span>
<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">ByteString</span>
<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">Generic</span>
<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">List</span>
<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">Mapping</span>
<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">NamedTuple</span>
<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">Optional</span>
<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">Sequence</span>
<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">Tuple</span>
<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">TypeVar</span>
<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">Union</span>
<span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
<span class="kn">from</span> <span class="nn">google.protobuf</span> <span class="kn">import</span> <span class="n">text_format</span>
<span class="kn">from</span> <span class="nn">apache_beam.portability.api</span> <span class="kn">import</span> <span class="n">schema_pb2</span>
<span class="kn">from</span> <span class="nn">apache_beam.typehints</span> <span class="kn">import</span> <span class="n">row_type</span>
<span class="kn">from</span> <span class="nn">apache_beam.typehints.native_type_compatibility</span> <span class="kn">import</span> <span class="n">_get_args</span>
<span class="kn">from</span> <span class="nn">apache_beam.typehints.native_type_compatibility</span> <span class="kn">import</span> <span class="n">_match_is_exactly_mapping</span>
<span class="kn">from</span> <span class="nn">apache_beam.typehints.native_type_compatibility</span> <span class="kn">import</span> <span class="n">_match_is_optional</span>
<span class="kn">from</span> <span class="nn">apache_beam.typehints.native_type_compatibility</span> <span class="kn">import</span> <span class="n">_safe_issubclass</span>
<span class="kn">from</span> <span class="nn">apache_beam.typehints.native_type_compatibility</span> <span class="kn">import</span> <span class="n">extract_optional_type</span>
<span class="kn">from</span> <span class="nn">apache_beam.typehints.native_type_compatibility</span> <span class="kn">import</span> <span class="n">match_is_named_tuple</span>
<span class="kn">from</span> <span class="nn">apache_beam.utils</span> <span class="kn">import</span> <span class="n">proto_utils</span>
<span class="kn">from</span> <span class="nn">apache_beam.utils.timestamp</span> <span class="kn">import</span> <span class="n">Timestamp</span>
<span class="n">PYTHON_ANY_URN</span> <span class="o">=</span> <span class="s2">&quot;beam:logical:pythonsdk_any:v1&quot;</span>
<span class="c1"># Registry of typings for a schema by UUID</span>
<div class="viewcode-block" id="SchemaTypeRegistry"><a class="viewcode-back" href="../../../apache_beam.typehints.schemas.html#apache_beam.typehints.schemas.SchemaTypeRegistry">[docs]</a><span class="k">class</span> <span class="nc">SchemaTypeRegistry</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">by_id</span> <span class="o">=</span> <span class="p">{}</span>
<span class="bp">self</span><span class="o">.</span><span class="n">by_typing</span> <span class="o">=</span> <span class="p">{}</span>
<div class="viewcode-block" id="SchemaTypeRegistry.generate_new_id"><a class="viewcode-back" href="../../../apache_beam.typehints.schemas.html#apache_beam.typehints.schemas.SchemaTypeRegistry.generate_new_id">[docs]</a> <span class="k">def</span> <span class="nf">generate_new_id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># Import uuid locally to guarantee we don&#39;t actually generate a uuid</span>
<span class="c1"># elsewhere in this file.</span>
<span class="kn">from</span> <span class="nn">uuid</span> <span class="kn">import</span> <span class="n">uuid4</span>
<span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">100</span><span class="p">):</span>
<span class="n">schema_id</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">uuid4</span><span class="p">())</span>
<span class="k">if</span> <span class="n">schema_id</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">by_id</span><span class="p">:</span>
<span class="k">return</span> <span class="n">schema_id</span>
<span class="k">raise</span> <span class="ne">AssertionError</span><span class="p">(</span>
<span class="s2">&quot;Failed to generate a unique UUID for schema after &quot;</span>
<span class="sa">f</span><span class="s2">&quot;100 tries! Registry contains </span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">by_id</span><span class="p">)</span><span class="si">}</span><span class="s2"> &quot;</span>
<span class="s2">&quot;schemas.&quot;</span><span class="p">)</span></div>
<div class="viewcode-block" id="SchemaTypeRegistry.add"><a class="viewcode-back" href="../../../apache_beam.typehints.schemas.html#apache_beam.typehints.schemas.SchemaTypeRegistry.add">[docs]</a> <span class="k">def</span> <span class="nf">add</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">typing</span><span class="p">,</span> <span class="n">schema</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">by_id</span><span class="p">[</span><span class="n">schema</span><span class="o">.</span><span class="n">id</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">typing</span><span class="p">,</span> <span class="n">schema</span><span class="p">)</span></div>
<div class="viewcode-block" id="SchemaTypeRegistry.get_typing_by_id"><a class="viewcode-back" href="../../../apache_beam.typehints.schemas.html#apache_beam.typehints.schemas.SchemaTypeRegistry.get_typing_by_id">[docs]</a> <span class="k">def</span> <span class="nf">get_typing_by_id</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">unique_id</span><span class="p">):</span>
<span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">by_id</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">unique_id</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="k">return</span> <span class="n">result</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="n">result</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="k">else</span> <span class="kc">None</span></div>
<div class="viewcode-block" id="SchemaTypeRegistry.get_schema_by_id"><a class="viewcode-back" href="../../../apache_beam.typehints.schemas.html#apache_beam.typehints.schemas.SchemaTypeRegistry.get_schema_by_id">[docs]</a> <span class="k">def</span> <span class="nf">get_schema_by_id</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">unique_id</span><span class="p">):</span>
<span class="n">result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">by_id</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">unique_id</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="k">return</span> <span class="n">result</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="k">if</span> <span class="n">result</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="k">else</span> <span class="kc">None</span></div></div>
<span class="n">SCHEMA_REGISTRY</span> <span class="o">=</span> <span class="n">SchemaTypeRegistry</span><span class="p">()</span>
<span class="c1"># Bi-directional mappings</span>
<span class="n">_PRIMITIVES</span> <span class="o">=</span> <span class="p">(</span>
<span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">int8</span><span class="p">,</span> <span class="n">schema_pb2</span><span class="o">.</span><span class="n">BYTE</span><span class="p">),</span>
<span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">int16</span><span class="p">,</span> <span class="n">schema_pb2</span><span class="o">.</span><span class="n">INT16</span><span class="p">),</span>
<span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">int32</span><span class="p">,</span> <span class="n">schema_pb2</span><span class="o">.</span><span class="n">INT32</span><span class="p">),</span>
<span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">int64</span><span class="p">,</span> <span class="n">schema_pb2</span><span class="o">.</span><span class="n">INT64</span><span class="p">),</span>
<span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">float32</span><span class="p">,</span> <span class="n">schema_pb2</span><span class="o">.</span><span class="n">FLOAT</span><span class="p">),</span>
<span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">float64</span><span class="p">,</span> <span class="n">schema_pb2</span><span class="o">.</span><span class="n">DOUBLE</span><span class="p">),</span>
<span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">schema_pb2</span><span class="o">.</span><span class="n">STRING</span><span class="p">),</span>
<span class="p">(</span><span class="nb">bool</span><span class="p">,</span> <span class="n">schema_pb2</span><span class="o">.</span><span class="n">BOOLEAN</span><span class="p">),</span>
<span class="p">(</span><span class="nb">bytes</span><span class="p">,</span> <span class="n">schema_pb2</span><span class="o">.</span><span class="n">BYTES</span><span class="p">),</span>
<span class="p">)</span>
<span class="n">PRIMITIVE_TO_ATOMIC_TYPE</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">((</span><span class="n">typ</span><span class="p">,</span> <span class="n">atomic</span><span class="p">)</span> <span class="k">for</span> <span class="n">typ</span><span class="p">,</span> <span class="n">atomic</span> <span class="ow">in</span> <span class="n">_PRIMITIVES</span><span class="p">)</span>
<span class="n">ATOMIC_TYPE_TO_PRIMITIVE</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">((</span><span class="n">atomic</span><span class="p">,</span> <span class="n">typ</span><span class="p">)</span> <span class="k">for</span> <span class="n">typ</span><span class="p">,</span> <span class="n">atomic</span> <span class="ow">in</span> <span class="n">_PRIMITIVES</span><span class="p">)</span>
<span class="c1"># One-way mappings</span>
<span class="n">PRIMITIVE_TO_ATOMIC_TYPE</span><span class="o">.</span><span class="n">update</span><span class="p">({</span>
<span class="n">ByteString</span><span class="p">:</span> <span class="n">schema_pb2</span><span class="o">.</span><span class="n">BYTES</span><span class="p">,</span>
<span class="c1"># Allow users to specify a native int, and use INT64 as the cross-language</span>
<span class="c1"># representation. Technically ints have unlimited precision, but RowCoder</span>
<span class="c1"># should throw an error if it sees one with a bit width &gt; 64 when encoding.</span>
<span class="nb">int</span><span class="p">:</span> <span class="n">schema_pb2</span><span class="o">.</span><span class="n">INT64</span><span class="p">,</span>
<span class="nb">float</span><span class="p">:</span> <span class="n">schema_pb2</span><span class="o">.</span><span class="n">DOUBLE</span><span class="p">,</span>
<span class="p">})</span>
<span class="c1"># Name of the attribute added to user types (existing and generated) to store</span>
<span class="c1"># the corresponding schema ID</span>
<span class="n">_BEAM_SCHEMA_ID</span> <span class="o">=</span> <span class="s2">&quot;_beam_schema_id&quot;</span>
<div class="viewcode-block" id="named_fields_to_schema"><a class="viewcode-back" href="../../../apache_beam.typehints.schemas.html#apache_beam.typehints.schemas.named_fields_to_schema">[docs]</a><span class="k">def</span> <span class="nf">named_fields_to_schema</span><span class="p">(</span><span class="n">names_and_types</span><span class="p">):</span>
<span class="c1"># type: (Union[Dict[str, type], Sequence[Tuple[str, type]]]) -&gt; schema_pb2.Schema</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">names_and_types</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span>
<span class="n">names_and_types</span> <span class="o">=</span> <span class="n">names_and_types</span><span class="o">.</span><span class="n">items</span><span class="p">()</span>
<span class="k">return</span> <span class="n">schema_pb2</span><span class="o">.</span><span class="n">Schema</span><span class="p">(</span>
<span class="n">fields</span><span class="o">=</span><span class="p">[</span>
<span class="n">schema_pb2</span><span class="o">.</span><span class="n">Field</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="n">name</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="n">typing_to_runner_api</span><span class="p">(</span><span class="nb">type</span><span class="p">))</span>
<span class="k">for</span> <span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="nb">type</span><span class="p">)</span> <span class="ow">in</span> <span class="n">names_and_types</span>
<span class="p">],</span>
<span class="nb">id</span><span class="o">=</span><span class="n">SCHEMA_REGISTRY</span><span class="o">.</span><span class="n">generate_new_id</span><span class="p">())</span></div>
<div class="viewcode-block" id="named_fields_from_schema"><a class="viewcode-back" href="../../../apache_beam.typehints.schemas.html#apache_beam.typehints.schemas.named_fields_from_schema">[docs]</a><span class="k">def</span> <span class="nf">named_fields_from_schema</span><span class="p">(</span>
<span class="n">schema</span><span class="p">):</span> <span class="c1"># (schema_pb2.Schema) -&gt; typing.List[typing.Tuple[str, type]]</span>
<span class="k">return</span> <span class="p">[(</span><span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">typing_from_runner_api</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">type</span><span class="p">))</span>
<span class="k">for</span> <span class="n">field</span> <span class="ow">in</span> <span class="n">schema</span><span class="o">.</span><span class="n">fields</span><span class="p">]</span></div>
<div class="viewcode-block" id="typing_to_runner_api"><a class="viewcode-back" href="../../../apache_beam.typehints.schemas.html#apache_beam.typehints.schemas.typing_to_runner_api">[docs]</a><span class="k">def</span> <span class="nf">typing_to_runner_api</span><span class="p">(</span>
<span class="n">type_</span><span class="p">:</span> <span class="nb">type</span><span class="p">,</span>
<span class="n">schema_registry</span><span class="p">:</span> <span class="n">SchemaTypeRegistry</span> <span class="o">=</span> <span class="n">SCHEMA_REGISTRY</span>
<span class="p">)</span> <span class="o">-&gt;</span> <span class="n">schema_pb2</span><span class="o">.</span><span class="n">FieldType</span><span class="p">:</span>
<span class="k">return</span> <span class="n">SchemaTranslation</span><span class="p">(</span>
<span class="n">schema_registry</span><span class="o">=</span><span class="n">schema_registry</span><span class="p">)</span><span class="o">.</span><span class="n">typing_to_runner_api</span><span class="p">(</span><span class="n">type_</span><span class="p">)</span></div>
<div class="viewcode-block" id="typing_from_runner_api"><a class="viewcode-back" href="../../../apache_beam.typehints.schemas.html#apache_beam.typehints.schemas.typing_from_runner_api">[docs]</a><span class="k">def</span> <span class="nf">typing_from_runner_api</span><span class="p">(</span>
<span class="n">fieldtype_proto</span><span class="p">:</span> <span class="n">schema_pb2</span><span class="o">.</span><span class="n">FieldType</span><span class="p">,</span>
<span class="n">schema_registry</span><span class="p">:</span> <span class="n">SchemaTypeRegistry</span> <span class="o">=</span> <span class="n">SCHEMA_REGISTRY</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">type</span><span class="p">:</span>
<span class="k">return</span> <span class="n">SchemaTranslation</span><span class="p">(</span>
<span class="n">schema_registry</span><span class="o">=</span><span class="n">schema_registry</span><span class="p">)</span><span class="o">.</span><span class="n">typing_from_runner_api</span><span class="p">(</span><span class="n">fieldtype_proto</span><span class="p">)</span></div>
<div class="viewcode-block" id="SchemaTranslation"><a class="viewcode-back" href="../../../apache_beam.typehints.schemas.html#apache_beam.typehints.schemas.SchemaTranslation">[docs]</a><span class="k">class</span> <span class="nc">SchemaTranslation</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">schema_registry</span><span class="p">:</span> <span class="n">SchemaTypeRegistry</span> <span class="o">=</span> <span class="n">SCHEMA_REGISTRY</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">schema_registry</span> <span class="o">=</span> <span class="n">schema_registry</span>
<div class="viewcode-block" id="SchemaTranslation.typing_to_runner_api"><a class="viewcode-back" href="../../../apache_beam.typehints.schemas.html#apache_beam.typehints.schemas.SchemaTranslation.typing_to_runner_api">[docs]</a> <span class="k">def</span> <span class="nf">typing_to_runner_api</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">type_</span><span class="p">:</span> <span class="nb">type</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">schema_pb2</span><span class="o">.</span><span class="n">FieldType</span><span class="p">:</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">type_</span><span class="p">,</span> <span class="n">schema_pb2</span><span class="o">.</span><span class="n">Schema</span><span class="p">):</span>
<span class="k">return</span> <span class="n">schema_pb2</span><span class="o">.</span><span class="n">FieldType</span><span class="p">(</span><span class="n">row_type</span><span class="o">=</span><span class="n">schema_pb2</span><span class="o">.</span><span class="n">RowType</span><span class="p">(</span><span class="n">schema</span><span class="o">=</span><span class="n">type_</span><span class="p">))</span>
<span class="k">elif</span> <span class="n">match_is_named_tuple</span><span class="p">(</span><span class="n">type_</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">type_</span><span class="p">,</span> <span class="n">_BEAM_SCHEMA_ID</span><span class="p">):</span>
<span class="n">schema_id</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">type_</span><span class="p">,</span> <span class="n">_BEAM_SCHEMA_ID</span><span class="p">)</span>
<span class="n">schema</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">schema_registry</span><span class="o">.</span><span class="n">get_schema_by_id</span><span class="p">(</span>
<span class="nb">getattr</span><span class="p">(</span><span class="n">type_</span><span class="p">,</span> <span class="n">_BEAM_SCHEMA_ID</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">schema_id</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">schema_registry</span><span class="o">.</span><span class="n">generate_new_id</span><span class="p">()</span>
<span class="n">schema</span> <span class="o">=</span> <span class="kc">None</span>
<span class="nb">setattr</span><span class="p">(</span><span class="n">type_</span><span class="p">,</span> <span class="n">_BEAM_SCHEMA_ID</span><span class="p">,</span> <span class="n">schema_id</span><span class="p">)</span>
<span class="k">if</span> <span class="n">schema</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">fields</span> <span class="o">=</span> <span class="p">[</span>
<span class="n">schema_pb2</span><span class="o">.</span><span class="n">Field</span><span class="p">(</span>
<span class="n">name</span><span class="o">=</span><span class="n">name</span><span class="p">,</span>
<span class="nb">type</span><span class="o">=</span><span class="n">typing_to_runner_api</span><span class="p">(</span><span class="n">type_</span><span class="o">.</span><span class="vm">__annotations__</span><span class="p">[</span><span class="n">name</span><span class="p">]))</span>
<span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">type_</span><span class="o">.</span><span class="n">_fields</span>
<span class="p">]</span>
<span class="n">schema</span> <span class="o">=</span> <span class="n">schema_pb2</span><span class="o">.</span><span class="n">Schema</span><span class="p">(</span><span class="n">fields</span><span class="o">=</span><span class="n">fields</span><span class="p">,</span> <span class="nb">id</span><span class="o">=</span><span class="n">schema_id</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">schema_registry</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">type_</span><span class="p">,</span> <span class="n">schema</span><span class="p">)</span>
<span class="k">return</span> <span class="n">schema_pb2</span><span class="o">.</span><span class="n">FieldType</span><span class="p">(</span><span class="n">row_type</span><span class="o">=</span><span class="n">schema_pb2</span><span class="o">.</span><span class="n">RowType</span><span class="p">(</span><span class="n">schema</span><span class="o">=</span><span class="n">schema</span><span class="p">))</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">type_</span><span class="p">,</span> <span class="n">row_type</span><span class="o">.</span><span class="n">RowTypeConstraint</span><span class="p">):</span>
<span class="k">return</span> <span class="n">schema_pb2</span><span class="o">.</span><span class="n">FieldType</span><span class="p">(</span>
<span class="n">row_type</span><span class="o">=</span><span class="n">schema_pb2</span><span class="o">.</span><span class="n">RowType</span><span class="p">(</span>
<span class="n">schema</span><span class="o">=</span><span class="n">schema_pb2</span><span class="o">.</span><span class="n">Schema</span><span class="p">(</span>
<span class="n">fields</span><span class="o">=</span><span class="p">[</span>
<span class="n">schema_pb2</span><span class="o">.</span><span class="n">Field</span><span class="p">(</span>
<span class="n">name</span><span class="o">=</span><span class="n">name</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="n">typing_to_runner_api</span><span class="p">(</span><span class="n">field_type</span><span class="p">))</span>
<span class="k">for</span> <span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">field_type</span><span class="p">)</span> <span class="ow">in</span> <span class="n">type_</span><span class="o">.</span><span class="n">_fields</span>
<span class="p">],</span>
<span class="nb">id</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">schema_registry</span><span class="o">.</span><span class="n">generate_new_id</span><span class="p">())))</span>
<span class="c1"># All concrete types (other than NamedTuple sub-classes) should map to</span>
<span class="c1"># a supported primitive type.</span>
<span class="k">elif</span> <span class="n">type_</span> <span class="ow">in</span> <span class="n">PRIMITIVE_TO_ATOMIC_TYPE</span><span class="p">:</span>
<span class="k">return</span> <span class="n">schema_pb2</span><span class="o">.</span><span class="n">FieldType</span><span class="p">(</span><span class="n">atomic_type</span><span class="o">=</span><span class="n">PRIMITIVE_TO_ATOMIC_TYPE</span><span class="p">[</span><span class="n">type_</span><span class="p">])</span>
<span class="k">elif</span> <span class="n">_match_is_exactly_mapping</span><span class="p">(</span><span class="n">type_</span><span class="p">):</span>
<span class="n">key_type</span><span class="p">,</span> <span class="n">value_type</span> <span class="o">=</span> <span class="nb">map</span><span class="p">(</span><span class="n">typing_to_runner_api</span><span class="p">,</span> <span class="n">_get_args</span><span class="p">(</span><span class="n">type_</span><span class="p">))</span>
<span class="k">return</span> <span class="n">schema_pb2</span><span class="o">.</span><span class="n">FieldType</span><span class="p">(</span>
<span class="n">map_type</span><span class="o">=</span><span class="n">schema_pb2</span><span class="o">.</span><span class="n">MapType</span><span class="p">(</span><span class="n">key_type</span><span class="o">=</span><span class="n">key_type</span><span class="p">,</span> <span class="n">value_type</span><span class="o">=</span><span class="n">value_type</span><span class="p">))</span>
<span class="k">elif</span> <span class="n">_match_is_optional</span><span class="p">(</span><span class="n">type_</span><span class="p">):</span>
<span class="c1"># It&#39;s possible that a user passes us Optional[Optional[T]], but in python</span>
<span class="c1"># typing this is indistinguishable from Optional[T] - both resolve to</span>
<span class="c1"># Union[T, None] - so there&#39;s no need to check for that case here.</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">typing_to_runner_api</span><span class="p">(</span><span class="n">extract_optional_type</span><span class="p">(</span><span class="n">type_</span><span class="p">))</span>
<span class="n">result</span><span class="o">.</span><span class="n">nullable</span> <span class="o">=</span> <span class="kc">True</span>
<span class="k">return</span> <span class="n">result</span>
<span class="k">elif</span> <span class="n">_safe_issubclass</span><span class="p">(</span><span class="n">type_</span><span class="p">,</span> <span class="n">Sequence</span><span class="p">):</span>
<span class="n">element_type</span> <span class="o">=</span> <span class="n">typing_to_runner_api</span><span class="p">(</span><span class="n">_get_args</span><span class="p">(</span><span class="n">type_</span><span class="p">)[</span><span class="mi">0</span><span class="p">])</span>
<span class="k">return</span> <span class="n">schema_pb2</span><span class="o">.</span><span class="n">FieldType</span><span class="p">(</span>
<span class="n">array_type</span><span class="o">=</span><span class="n">schema_pb2</span><span class="o">.</span><span class="n">ArrayType</span><span class="p">(</span><span class="n">element_type</span><span class="o">=</span><span class="n">element_type</span><span class="p">))</span>
<span class="k">elif</span> <span class="n">_safe_issubclass</span><span class="p">(</span><span class="n">type_</span><span class="p">,</span> <span class="n">Mapping</span><span class="p">):</span>
<span class="n">key_type</span><span class="p">,</span> <span class="n">value_type</span> <span class="o">=</span> <span class="nb">map</span><span class="p">(</span><span class="n">typing_to_runner_api</span><span class="p">,</span> <span class="n">_get_args</span><span class="p">(</span><span class="n">type_</span><span class="p">))</span>
<span class="k">return</span> <span class="n">schema_pb2</span><span class="o">.</span><span class="n">FieldType</span><span class="p">(</span>
<span class="n">map_type</span><span class="o">=</span><span class="n">schema_pb2</span><span class="o">.</span><span class="n">MapType</span><span class="p">(</span><span class="n">key_type</span><span class="o">=</span><span class="n">key_type</span><span class="p">,</span> <span class="n">value_type</span><span class="o">=</span><span class="n">value_type</span><span class="p">))</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">logical_type</span> <span class="o">=</span> <span class="n">LogicalType</span><span class="o">.</span><span class="n">from_typing</span><span class="p">(</span><span class="n">type_</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
<span class="c1"># Unknown type, just treat it like Any</span>
<span class="k">return</span> <span class="n">schema_pb2</span><span class="o">.</span><span class="n">FieldType</span><span class="p">(</span>
<span class="n">logical_type</span><span class="o">=</span><span class="n">schema_pb2</span><span class="o">.</span><span class="n">LogicalType</span><span class="p">(</span><span class="n">urn</span><span class="o">=</span><span class="n">PYTHON_ANY_URN</span><span class="p">),</span>
<span class="n">nullable</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># TODO(bhulette): Add support for logical types that require arguments</span>
<span class="k">return</span> <span class="n">schema_pb2</span><span class="o">.</span><span class="n">FieldType</span><span class="p">(</span>
<span class="n">logical_type</span><span class="o">=</span><span class="n">schema_pb2</span><span class="o">.</span><span class="n">LogicalType</span><span class="p">(</span>
<span class="n">urn</span><span class="o">=</span><span class="n">logical_type</span><span class="o">.</span><span class="n">urn</span><span class="p">(),</span>
<span class="n">representation</span><span class="o">=</span><span class="n">typing_to_runner_api</span><span class="p">(</span>
<span class="n">logical_type</span><span class="o">.</span><span class="n">representation_type</span><span class="p">())))</span></div>
<div class="viewcode-block" id="SchemaTranslation.typing_from_runner_api"><a class="viewcode-back" href="../../../apache_beam.typehints.schemas.html#apache_beam.typehints.schemas.SchemaTranslation.typing_from_runner_api">[docs]</a> <span class="k">def</span> <span class="nf">typing_from_runner_api</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span> <span class="n">fieldtype_proto</span><span class="p">:</span> <span class="n">schema_pb2</span><span class="o">.</span><span class="n">FieldType</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">type</span><span class="p">:</span>
<span class="k">if</span> <span class="n">fieldtype_proto</span><span class="o">.</span><span class="n">nullable</span><span class="p">:</span>
<span class="c1"># In order to determine the inner type, create a copy of fieldtype_proto</span>
<span class="c1"># with nullable=False and pass back to typing_from_runner_api</span>
<span class="n">base_type</span> <span class="o">=</span> <span class="n">schema_pb2</span><span class="o">.</span><span class="n">FieldType</span><span class="p">()</span>
<span class="n">base_type</span><span class="o">.</span><span class="n">CopyFrom</span><span class="p">(</span><span class="n">fieldtype_proto</span><span class="p">)</span>
<span class="n">base_type</span><span class="o">.</span><span class="n">nullable</span> <span class="o">=</span> <span class="kc">False</span>
<span class="n">base</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">typing_from_runner_api</span><span class="p">(</span><span class="n">base_type</span><span class="p">)</span>
<span class="k">if</span> <span class="n">base</span> <span class="o">==</span> <span class="n">Any</span><span class="p">:</span>
<span class="k">return</span> <span class="n">base</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="n">Optional</span><span class="p">[</span><span class="n">base</span><span class="p">]</span>
<span class="n">type_info</span> <span class="o">=</span> <span class="n">fieldtype_proto</span><span class="o">.</span><span class="n">WhichOneof</span><span class="p">(</span><span class="s2">&quot;type_info&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">type_info</span> <span class="o">==</span> <span class="s2">&quot;atomic_type&quot;</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="n">ATOMIC_TYPE_TO_PRIMITIVE</span><span class="p">[</span><span class="n">fieldtype_proto</span><span class="o">.</span><span class="n">atomic_type</span><span class="p">]</span>
<span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
<span class="s2">&quot;Unsupported atomic type: </span><span class="si">{0}</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">fieldtype_proto</span><span class="o">.</span><span class="n">atomic_type</span><span class="p">))</span>
<span class="k">elif</span> <span class="n">type_info</span> <span class="o">==</span> <span class="s2">&quot;array_type&quot;</span><span class="p">:</span>
<span class="k">return</span> <span class="n">Sequence</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">typing_from_runner_api</span><span class="p">(</span>
<span class="n">fieldtype_proto</span><span class="o">.</span><span class="n">array_type</span><span class="o">.</span><span class="n">element_type</span><span class="p">)]</span>
<span class="k">elif</span> <span class="n">type_info</span> <span class="o">==</span> <span class="s2">&quot;map_type&quot;</span><span class="p">:</span>
<span class="k">return</span> <span class="n">Mapping</span><span class="p">[</span>
<span class="bp">self</span><span class="o">.</span><span class="n">typing_from_runner_api</span><span class="p">(</span><span class="n">fieldtype_proto</span><span class="o">.</span><span class="n">map_type</span><span class="o">.</span><span class="n">key_type</span><span class="p">),</span>
<span class="bp">self</span><span class="o">.</span><span class="n">typing_from_runner_api</span><span class="p">(</span><span class="n">fieldtype_proto</span><span class="o">.</span><span class="n">map_type</span><span class="o">.</span><span class="n">value_type</span><span class="p">)]</span>
<span class="k">elif</span> <span class="n">type_info</span> <span class="o">==</span> <span class="s2">&quot;row_type&quot;</span><span class="p">:</span>
<span class="n">schema</span> <span class="o">=</span> <span class="n">fieldtype_proto</span><span class="o">.</span><span class="n">row_type</span><span class="o">.</span><span class="n">schema</span>
<span class="n">user_type</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">schema_registry</span><span class="o">.</span><span class="n">get_typing_by_id</span><span class="p">(</span><span class="n">schema</span><span class="o">.</span><span class="n">id</span><span class="p">)</span>
<span class="k">if</span> <span class="n">user_type</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="kn">from</span> <span class="nn">apache_beam</span> <span class="kn">import</span> <span class="n">coders</span>
<span class="n">type_name</span> <span class="o">=</span> <span class="s1">&#39;BeamSchema_</span><span class="si">{}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">schema</span><span class="o">.</span><span class="n">id</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;-&#39;</span><span class="p">,</span> <span class="s1">&#39;_&#39;</span><span class="p">))</span>
<span class="n">subfields</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">field</span> <span class="ow">in</span> <span class="n">schema</span><span class="o">.</span><span class="n">fields</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">field_py_type</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">typing_from_runner_api</span><span class="p">(</span><span class="n">field</span><span class="o">.</span><span class="n">type</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">ValueError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
<span class="s2">&quot;Failed to decode schema due to an issue with Field proto:</span><span class="se">\n\n</span><span class="s2">&quot;</span>
<span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">text_format</span><span class="o">.</span><span class="n">MessageToString</span><span class="p">(</span><span class="n">field</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span> <span class="kn">from</span> <span class="nn">e</span>
<span class="n">subfields</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">field</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">field_py_type</span><span class="p">))</span>
<span class="n">user_type</span> <span class="o">=</span> <span class="n">NamedTuple</span><span class="p">(</span><span class="n">type_name</span><span class="p">,</span> <span class="n">subfields</span><span class="p">)</span>
<span class="nb">setattr</span><span class="p">(</span><span class="n">user_type</span><span class="p">,</span> <span class="n">_BEAM_SCHEMA_ID</span><span class="p">,</span> <span class="n">schema</span><span class="o">.</span><span class="n">id</span><span class="p">)</span>
<span class="c1"># Define a reduce function, otherwise these types can&#39;t be pickled</span>
<span class="c1"># (See BEAM-9574)</span>
<span class="k">def</span> <span class="nf">__reduce__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="p">(</span>
<span class="n">_hydrate_namedtuple_instance</span><span class="p">,</span>
<span class="p">(</span><span class="n">schema</span><span class="o">.</span><span class="n">SerializeToString</span><span class="p">(),</span> <span class="nb">tuple</span><span class="p">(</span><span class="bp">self</span><span class="p">)))</span>
<span class="nb">setattr</span><span class="p">(</span><span class="n">user_type</span><span class="p">,</span> <span class="s1">&#39;__reduce__&#39;</span><span class="p">,</span> <span class="n">__reduce__</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">schema_registry</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">user_type</span><span class="p">,</span> <span class="n">schema</span><span class="p">)</span>
<span class="n">coders</span><span class="o">.</span><span class="n">registry</span><span class="o">.</span><span class="n">register_coder</span><span class="p">(</span><span class="n">user_type</span><span class="p">,</span> <span class="n">coders</span><span class="o">.</span><span class="n">RowCoder</span><span class="p">)</span>
<span class="k">return</span> <span class="n">user_type</span>
<span class="k">elif</span> <span class="n">type_info</span> <span class="o">==</span> <span class="s2">&quot;logical_type&quot;</span><span class="p">:</span>
<span class="k">if</span> <span class="n">fieldtype_proto</span><span class="o">.</span><span class="n">logical_type</span><span class="o">.</span><span class="n">urn</span> <span class="o">==</span> <span class="n">PYTHON_ANY_URN</span><span class="p">:</span>
<span class="k">return</span> <span class="n">Any</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="n">LogicalType</span><span class="o">.</span><span class="n">from_runner_api</span><span class="p">(</span>
<span class="n">fieldtype_proto</span><span class="o">.</span><span class="n">logical_type</span><span class="p">)</span><span class="o">.</span><span class="n">language_type</span><span class="p">()</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Unrecognized type_info: </span><span class="si">{</span><span class="n">type_info</span><span class="si">!r}</span><span class="s2">&quot;</span><span class="p">)</span></div></div>
<span class="k">def</span> <span class="nf">_hydrate_namedtuple_instance</span><span class="p">(</span><span class="n">encoded_schema</span><span class="p">,</span> <span class="n">values</span><span class="p">):</span>
<span class="k">return</span> <span class="n">named_tuple_from_schema</span><span class="p">(</span>
<span class="n">proto_utils</span><span class="o">.</span><span class="n">parse_Bytes</span><span class="p">(</span><span class="n">encoded_schema</span><span class="p">,</span> <span class="n">schema_pb2</span><span class="o">.</span><span class="n">Schema</span><span class="p">))(</span><span class="o">*</span><span class="n">values</span><span class="p">)</span>
<div class="viewcode-block" id="named_tuple_from_schema"><a class="viewcode-back" href="../../../apache_beam.typehints.schemas.html#apache_beam.typehints.schemas.named_tuple_from_schema">[docs]</a><span class="k">def</span> <span class="nf">named_tuple_from_schema</span><span class="p">(</span><span class="n">schema</span><span class="p">):</span>
<span class="k">return</span> <span class="n">typing_from_runner_api</span><span class="p">(</span>
<span class="n">schema_pb2</span><span class="o">.</span><span class="n">FieldType</span><span class="p">(</span><span class="n">row_type</span><span class="o">=</span><span class="n">schema_pb2</span><span class="o">.</span><span class="n">RowType</span><span class="p">(</span><span class="n">schema</span><span class="o">=</span><span class="n">schema</span><span class="p">)))</span></div>
<div class="viewcode-block" id="named_tuple_to_schema"><a class="viewcode-back" href="../../../apache_beam.typehints.schemas.html#apache_beam.typehints.schemas.named_tuple_to_schema">[docs]</a><span class="k">def</span> <span class="nf">named_tuple_to_schema</span><span class="p">(</span><span class="n">named_tuple</span><span class="p">):</span>
<span class="k">return</span> <span class="n">typing_to_runner_api</span><span class="p">(</span><span class="n">named_tuple</span><span class="p">)</span><span class="o">.</span><span class="n">row_type</span><span class="o">.</span><span class="n">schema</span></div>
<div class="viewcode-block" id="schema_from_element_type"><a class="viewcode-back" href="../../../apache_beam.typehints.schemas.html#apache_beam.typehints.schemas.schema_from_element_type">[docs]</a><span class="k">def</span> <span class="nf">schema_from_element_type</span><span class="p">(</span><span class="n">element_type</span><span class="p">:</span> <span class="nb">type</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">schema_pb2</span><span class="o">.</span><span class="n">Schema</span><span class="p">:</span>
<span class="sd">&quot;&quot;&quot;Get a schema for the given PCollection element_type.</span>
<span class="sd"> Returns schema as a list of (name, python_type) tuples&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">element_type</span><span class="p">,</span> <span class="n">row_type</span><span class="o">.</span><span class="n">RowTypeConstraint</span><span class="p">):</span>
<span class="c1"># TODO(BEAM-10722): Make sure beam.Row generated schemas are registered and</span>
<span class="c1"># de-duped</span>
<span class="k">return</span> <span class="n">named_fields_to_schema</span><span class="p">(</span><span class="n">element_type</span><span class="o">.</span><span class="n">_fields</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">match_is_named_tuple</span><span class="p">(</span><span class="n">element_type</span><span class="p">):</span>
<span class="k">return</span> <span class="n">named_tuple_to_schema</span><span class="p">(</span><span class="n">element_type</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
<span class="sa">f</span><span class="s2">&quot;Could not determine schema for type hint </span><span class="si">{</span><span class="n">element_type</span><span class="si">!r}</span><span class="s2">. Did you &quot;</span>
<span class="s2">&quot;mean to create a schema-aware PCollection? See &quot;</span>
<span class="s2">&quot;https://s.apache.org/beam-python-schemas&quot;</span><span class="p">)</span></div>
<div class="viewcode-block" id="named_fields_from_element_type"><a class="viewcode-back" href="../../../apache_beam.typehints.schemas.html#apache_beam.typehints.schemas.named_fields_from_element_type">[docs]</a><span class="k">def</span> <span class="nf">named_fields_from_element_type</span><span class="p">(</span>
<span class="n">element_type</span><span class="p">:</span> <span class="nb">type</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="n">Tuple</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">type</span><span class="p">]]:</span>
<span class="k">return</span> <span class="n">named_fields_from_schema</span><span class="p">(</span><span class="n">schema_from_element_type</span><span class="p">(</span><span class="n">element_type</span><span class="p">))</span></div>
<span class="c1"># Registry of typings for a schema by UUID</span>
<div class="viewcode-block" id="LogicalTypeRegistry"><a class="viewcode-back" href="../../../apache_beam.typehints.schemas.html#apache_beam.typehints.schemas.LogicalTypeRegistry">[docs]</a><span class="k">class</span> <span class="nc">LogicalTypeRegistry</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">by_urn</span> <span class="o">=</span> <span class="p">{}</span>
<span class="bp">self</span><span class="o">.</span><span class="n">by_logical_type</span> <span class="o">=</span> <span class="p">{}</span>
<span class="bp">self</span><span class="o">.</span><span class="n">by_language_type</span> <span class="o">=</span> <span class="p">{}</span>
<div class="viewcode-block" id="LogicalTypeRegistry.add"><a class="viewcode-back" href="../../../apache_beam.typehints.schemas.html#apache_beam.typehints.schemas.LogicalTypeRegistry.add">[docs]</a> <span class="k">def</span> <span class="nf">add</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">urn</span><span class="p">,</span> <span class="n">logical_type</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">by_urn</span><span class="p">[</span><span class="n">urn</span><span class="p">]</span> <span class="o">=</span> <span class="n">logical_type</span>
<span class="bp">self</span><span class="o">.</span><span class="n">by_logical_type</span><span class="p">[</span><span class="n">logical_type</span><span class="p">]</span> <span class="o">=</span> <span class="n">urn</span>
<span class="bp">self</span><span class="o">.</span><span class="n">by_language_type</span><span class="p">[</span><span class="n">logical_type</span><span class="o">.</span><span class="n">language_type</span><span class="p">()]</span> <span class="o">=</span> <span class="n">logical_type</span></div>
<div class="viewcode-block" id="LogicalTypeRegistry.get_logical_type_by_urn"><a class="viewcode-back" href="../../../apache_beam.typehints.schemas.html#apache_beam.typehints.schemas.LogicalTypeRegistry.get_logical_type_by_urn">[docs]</a> <span class="k">def</span> <span class="nf">get_logical_type_by_urn</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">urn</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">by_urn</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">urn</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span></div>
<div class="viewcode-block" id="LogicalTypeRegistry.get_urn_by_logial_type"><a class="viewcode-back" href="../../../apache_beam.typehints.schemas.html#apache_beam.typehints.schemas.LogicalTypeRegistry.get_urn_by_logial_type">[docs]</a> <span class="k">def</span> <span class="nf">get_urn_by_logial_type</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">logical_type</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">by_logical_type</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">logical_type</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span></div>
<div class="viewcode-block" id="LogicalTypeRegistry.get_logical_type_by_language_type"><a class="viewcode-back" href="../../../apache_beam.typehints.schemas.html#apache_beam.typehints.schemas.LogicalTypeRegistry.get_logical_type_by_language_type">[docs]</a> <span class="k">def</span> <span class="nf">get_logical_type_by_language_type</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">representation_type</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">by_language_type</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">representation_type</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span></div></div>
<span class="n">LanguageT</span> <span class="o">=</span> <span class="n">TypeVar</span><span class="p">(</span><span class="s1">&#39;LanguageT&#39;</span><span class="p">)</span>
<span class="n">RepresentationT</span> <span class="o">=</span> <span class="n">TypeVar</span><span class="p">(</span><span class="s1">&#39;RepresentationT&#39;</span><span class="p">)</span>
<span class="n">ArgT</span> <span class="o">=</span> <span class="n">TypeVar</span><span class="p">(</span><span class="s1">&#39;ArgT&#39;</span><span class="p">)</span>
<div class="viewcode-block" id="LogicalType"><a class="viewcode-back" href="../../../apache_beam.typehints.schemas.html#apache_beam.typehints.schemas.LogicalType">[docs]</a><span class="k">class</span> <span class="nc">LogicalType</span><span class="p">(</span><span class="n">Generic</span><span class="p">[</span><span class="n">LanguageT</span><span class="p">,</span> <span class="n">RepresentationT</span><span class="p">,</span> <span class="n">ArgT</span><span class="p">]):</span>
<span class="n">_known_logical_types</span> <span class="o">=</span> <span class="n">LogicalTypeRegistry</span><span class="p">()</span>
<div class="viewcode-block" id="LogicalType.urn"><a class="viewcode-back" href="../../../apache_beam.typehints.schemas.html#apache_beam.typehints.schemas.LogicalType.urn">[docs]</a> <span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">urn</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
<span class="c1"># type: () -&gt; str</span>
<span class="sd">&quot;&quot;&quot;Return the URN used to identify this logical type&quot;&quot;&quot;</span>
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span></div>
<div class="viewcode-block" id="LogicalType.language_type"><a class="viewcode-back" href="../../../apache_beam.typehints.schemas.html#apache_beam.typehints.schemas.LogicalType.language_type">[docs]</a> <span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">language_type</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
<span class="c1"># type: () -&gt; type</span>
<span class="sd">&quot;&quot;&quot;Return the language type this LogicalType encodes.</span>
<span class="sd"> The returned type should match LanguageT&quot;&quot;&quot;</span>
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span></div>
<div class="viewcode-block" id="LogicalType.representation_type"><a class="viewcode-back" href="../../../apache_beam.typehints.schemas.html#apache_beam.typehints.schemas.LogicalType.representation_type">[docs]</a> <span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">representation_type</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
<span class="c1"># type: () -&gt; type</span>
<span class="sd">&quot;&quot;&quot;Return the type of the representation this LogicalType uses to encode the</span>
<span class="sd"> language type.</span>
<span class="sd"> The returned type should match RepresentationT&quot;&quot;&quot;</span>
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span></div>
<div class="viewcode-block" id="LogicalType.argument_type"><a class="viewcode-back" href="../../../apache_beam.typehints.schemas.html#apache_beam.typehints.schemas.LogicalType.argument_type">[docs]</a> <span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">argument_type</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
<span class="c1"># type: () -&gt; type</span>
<span class="sd">&quot;&quot;&quot;Return the type of the argument used for variations of this LogicalType.</span>
<span class="sd"> The returned type should match ArgT&quot;&quot;&quot;</span>
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="bp">cls</span><span class="p">)</span></div>
<div class="viewcode-block" id="LogicalType.argument"><a class="viewcode-back" href="../../../apache_beam.typehints.schemas.html#apache_beam.typehints.schemas.LogicalType.argument">[docs]</a> <span class="k">def</span> <span class="nf">argument</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># type: () -&gt; ArgT</span>
<span class="sd">&quot;&quot;&quot;Return the argument for this instance of the LogicalType.&quot;&quot;&quot;</span>
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span></div>
<div class="viewcode-block" id="LogicalType.to_representation_type"><a class="viewcode-back" href="../../../apache_beam.typehints.schemas.html#apache_beam.typehints.schemas.LogicalType.to_representation_type">[docs]</a> <span class="k">def</span> <span class="nf">to_representation_type</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
<span class="c1"># type: (LanguageT) -&gt; RepresentationT</span>
<span class="sd">&quot;&quot;&quot;Convert an instance of LanguageT to RepresentationT.&quot;&quot;&quot;</span>
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span></div>
<div class="viewcode-block" id="LogicalType.to_language_type"><a class="viewcode-back" href="../../../apache_beam.typehints.schemas.html#apache_beam.typehints.schemas.LogicalType.to_language_type">[docs]</a> <span class="k">def</span> <span class="nf">to_language_type</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
<span class="c1"># type: (RepresentationT) -&gt; LanguageT</span>
<span class="sd">&quot;&quot;&quot;Convert an instance of RepresentationT to LanguageT.&quot;&quot;&quot;</span>
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span></div>
<div class="viewcode-block" id="LogicalType.register_logical_type"><a class="viewcode-back" href="../../../apache_beam.typehints.schemas.html#apache_beam.typehints.schemas.LogicalType.register_logical_type">[docs]</a> <span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">register_logical_type</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">logical_type_cls</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Register an implementation of LogicalType.&quot;&quot;&quot;</span>
<span class="bp">cls</span><span class="o">.</span><span class="n">_known_logical_types</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">logical_type_cls</span><span class="o">.</span><span class="n">urn</span><span class="p">(),</span> <span class="n">logical_type_cls</span><span class="p">)</span></div>
<div class="viewcode-block" id="LogicalType.from_typing"><a class="viewcode-back" href="../../../apache_beam.typehints.schemas.html#apache_beam.typehints.schemas.LogicalType.from_typing">[docs]</a> <span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">from_typing</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">typ</span><span class="p">):</span>
<span class="c1"># type: (type) -&gt; LogicalType</span>
<span class="sd">&quot;&quot;&quot;Construct an instance of a registered LogicalType implementation given a</span>
<span class="sd"> typing.</span>
<span class="sd"> Raises ValueError if no registered LogicalType implementation can encode the</span>
<span class="sd"> given typing.&quot;&quot;&quot;</span>
<span class="n">logical_type</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_known_logical_types</span><span class="o">.</span><span class="n">get_logical_type_by_language_type</span><span class="p">(</span>
<span class="n">typ</span><span class="p">)</span>
<span class="k">if</span> <span class="n">logical_type</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;No logical type registered for typing &#39;</span><span class="si">%s</span><span class="s2">&#39;&quot;</span> <span class="o">%</span> <span class="n">typ</span><span class="p">)</span>
<span class="k">return</span> <span class="n">logical_type</span><span class="o">.</span><span class="n">_from_typing</span><span class="p">(</span><span class="n">typ</span><span class="p">)</span></div>
<span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">_from_typing</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">typ</span><span class="p">):</span>
<span class="c1"># type: (type) -&gt; LogicalType</span>
<span class="sd">&quot;&quot;&quot;Construct an instance of this LogicalType implementation given a typing.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">()</span>
<div class="viewcode-block" id="LogicalType.from_runner_api"><a class="viewcode-back" href="../../../apache_beam.typehints.schemas.html#apache_beam.typehints.schemas.LogicalType.from_runner_api">[docs]</a> <span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">from_runner_api</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">logical_type_proto</span><span class="p">):</span>
<span class="c1"># type: (schema_pb2.LogicalType) -&gt; LogicalType</span>
<span class="sd">&quot;&quot;&quot;Construct an instance of a registered LogicalType implementation given a</span>
<span class="sd"> proto LogicalType.</span>
<span class="sd"> Raises ValueError if no LogicalType registered for the given URN.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">logical_type</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_known_logical_types</span><span class="o">.</span><span class="n">get_logical_type_by_urn</span><span class="p">(</span>
<span class="n">logical_type_proto</span><span class="o">.</span><span class="n">urn</span><span class="p">)</span>
<span class="k">if</span> <span class="n">logical_type</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
<span class="s2">&quot;No logical type registered for URN &#39;</span><span class="si">%s</span><span class="s2">&#39;&quot;</span> <span class="o">%</span> <span class="n">logical_type_proto</span><span class="o">.</span><span class="n">urn</span><span class="p">)</span>
<span class="c1"># TODO(bhulette): Use argument</span>
<span class="k">return</span> <span class="n">logical_type</span><span class="p">()</span></div></div>
<div class="viewcode-block" id="NoArgumentLogicalType"><a class="viewcode-back" href="../../../apache_beam.typehints.schemas.html#apache_beam.typehints.schemas.NoArgumentLogicalType">[docs]</a><span class="k">class</span> <span class="nc">NoArgumentLogicalType</span><span class="p">(</span><span class="n">LogicalType</span><span class="p">[</span><span class="n">LanguageT</span><span class="p">,</span> <span class="n">RepresentationT</span><span class="p">,</span> <span class="kc">None</span><span class="p">]):</span>
<div class="viewcode-block" id="NoArgumentLogicalType.argument_type"><a class="viewcode-back" href="../../../apache_beam.typehints.schemas.html#apache_beam.typehints.schemas.NoArgumentLogicalType.argument_type">[docs]</a> <span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">argument_type</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
<span class="c1"># type: () -&gt; type</span>
<span class="k">return</span> <span class="kc">None</span></div>
<div class="viewcode-block" id="NoArgumentLogicalType.argument"><a class="viewcode-back" href="../../../apache_beam.typehints.schemas.html#apache_beam.typehints.schemas.NoArgumentLogicalType.argument">[docs]</a> <span class="k">def</span> <span class="nf">argument</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># type: () -&gt; ArgT</span>
<span class="k">return</span> <span class="kc">None</span></div>
<span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">_from_typing</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">typ</span><span class="p">):</span>
<span class="c1"># type: (type) -&gt; LogicalType</span>
<span class="c1"># Since there&#39;s no argument, there can be no additional information encoded</span>
<span class="c1"># in the typing. Just construct an instance.</span>
<span class="k">return</span> <span class="bp">cls</span><span class="p">()</span></div>
<span class="n">MicrosInstantRepresentation</span> <span class="o">=</span> <span class="n">NamedTuple</span><span class="p">(</span>
<span class="s1">&#39;MicrosInstantRepresentation&#39;</span><span class="p">,</span> <span class="p">[(</span><span class="s1">&#39;seconds&#39;</span><span class="p">,</span> <span class="n">np</span><span class="o">.</span><span class="n">int64</span><span class="p">),</span>
<span class="p">(</span><span class="s1">&#39;micros&#39;</span><span class="p">,</span> <span class="n">np</span><span class="o">.</span><span class="n">int64</span><span class="p">)])</span>
<span class="nd">@LogicalType</span><span class="o">.</span><span class="n">register_logical_type</span>
<span class="k">class</span> <span class="nc">MicrosInstant</span><span class="p">(</span><span class="n">NoArgumentLogicalType</span><span class="p">[</span><span class="n">Timestamp</span><span class="p">,</span>
<span class="n">MicrosInstantRepresentation</span><span class="p">]):</span>
<span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">urn</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
<span class="k">return</span> <span class="s2">&quot;beam:logical_type:micros_instant:v1&quot;</span>
<span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">representation_type</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
<span class="c1"># type: () -&gt; type</span>
<span class="k">return</span> <span class="n">MicrosInstantRepresentation</span>
<span class="nd">@classmethod</span>
<span class="k">def</span> <span class="nf">language_type</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
<span class="k">return</span> <span class="n">Timestamp</span>
<span class="k">def</span> <span class="nf">to_representation_type</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="c1"># type: (Timestamp) -&gt; MicrosInstantRepresentation</span>
<span class="k">return</span> <span class="n">MicrosInstantRepresentation</span><span class="p">(</span>
<span class="n">value</span><span class="o">.</span><span class="n">micros</span> <span class="o">//</span> <span class="mi">1000000</span><span class="p">,</span> <span class="n">value</span><span class="o">.</span><span class="n">micros</span> <span class="o">%</span> <span class="mi">1000000</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">to_language_type</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="c1"># type: (MicrosInstantRepresentation) -&gt; Timestamp</span>
<span class="k">return</span> <span class="n">Timestamp</span><span class="p">(</span><span class="n">seconds</span><span class="o">=</span><span class="nb">int</span><span class="p">(</span><span class="n">value</span><span class="o">.</span><span class="n">seconds</span><span class="p">),</span> <span class="n">micros</span><span class="o">=</span><span class="nb">int</span><span class="p">(</span><span class="n">value</span><span class="o">.</span><span class="n">micros</span><span class="p">))</span>
</pre></div>
</div>
</div>
<footer>
<hr/>
<div role="contentinfo">
<p>
&copy; Copyright
</p>
</div>
Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>