<p dir="auto">When I was developing <a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="226379710" data-permission-text="Title is private" data-url="https://github.com/pandas-dev/pandas/issues/16237" data-hovercard-type="pull_request" data-hovercard-url="/pandas-dev/pandas/pull/16237/hovercard" href="https://github.com/pandas-dev/pandas/pull/16237">#16237</a>, I noticed that the API for checking <code class="notranslate">dtype</code> is quite messy.  We appear to have duplicate functionality, and the interface is not clear as to what we should accept.</p>
<p dir="auto">I propose that for all such <code class="notranslate">dtype</code> checking functions, we should accept ANY array-like and ANY <code class="notranslate">dtype</code> OR <code class="notranslate">type</code> object and cast any <code class="notranslate">list</code>-like object to <code class="notranslate">np.array</code>.</p>
<p dir="auto">Also, I added several <code class="notranslate">TODO</code> in that same <a href="https://github.com/pandas-dev/pandas/blob/1a0c878f733c5fc2b37e6f6ab655e943685036f9/pandas/core/dtypes/common.py">file</a> that I was hoping to get some feedback on.  They stood out to me because they seemed either non-intuitive OR symptomatic of the API redundancy that I was referring to.</p>
<ul dir="auto">
<li><code class="notranslate">is_datetimetz</code> seems like a duplicate of <code class="notranslate">is_datetime64tz_dtype</code>.  Do we need it?</li>
<li><code class="notranslate">is_period</code> seems like a duplicate of <code class="notranslate">is_period_arraylike</code>.  Do we need it?</li>
<li>Should <code class="notranslate">Period</code> be an instance of <code class="notranslate">PeriodDtype</code>?</li>
<li>Should <code class="notranslate">Interval</code> be an instance of <code class="notranslate">IntervalDtype</code>?</li>
</ul>
<p dir="auto"><strong>[in]</strong></p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="for cl in train.columns:
     print cl, type(train.loc[0, cl])
     print cl, type(train[cl][0])
     break"><pre class="notranslate"><code class="notranslate">for cl in train.columns:
     print cl, type(train.loc[0, cl])
     print cl, type(train[cl][0])
     break
</code></pre></div>
<p dir="auto"><strong>[out]</strong></p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="record_ID &lt;type 'numpy.float64'&gt; 
record_ID &lt;type 'numpy.int64'&gt;"><pre class="notranslate"><code class="notranslate">record_ID &lt;type 'numpy.float64'&gt; 
record_ID &lt;type 'numpy.int64'&gt;
</code></pre></div>
<p dir="auto">Though I can solve it in many cases with <code class="notranslate">train[cl].dtype</code>, which gives the correct output:</p>
<p dir="auto"><strong>[out]</strong></p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="record_ID int64"><pre class="notranslate"><code class="notranslate">record_ID int64
</code></pre></div>
<p dir="auto">But if we work with string data types the output will be <code class="notranslate">object</code> instead of <code class="notranslate">str</code> as data type.</p>
<p dir="auto">Something shortstop by me or what happens?<br>
Thank you.</p>