🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2061閲覧

型ヒントTypingで、「str以外のSequence」を表す型がないか知りたい

nikori

総合スコア19

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/10/29 08:36

前提・実現したいこと

タイトルの通りです。
Pythonの型ヒントを利用したいと考えています。
「list, tuple, numpy.ndarray」の中にstrが含まれている型、を表現する方法が存在するのか知りたいと考えています。

イメージとしては、typing.Sequence[str]なのですが、
pycharmの型チェックでは、strを許容してしまいます。
(strがsequenceであると同時に、その成分一つ一つもstr型であるからだと認識しています。)

なにか良案がありましたらご教示いただけますと幸いです。
どうぞよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nico25

2019/10/29 09:02 編集

自分もそのように思います。 > (strがsequenceであると同時に、その成分一つ一つもstr型であるからだと認識しています。) ```python s = 'Hello, world!' assert type(s[0]) is str assert type(s[0][0]) is str assert type(s[0][0][0]) is str ``` typing.Sequence[str] で str を **除外** したいということだと思うのですが、 Union を使って Sequence を繋ぎ合わせるしかなさそうです... ```python # このような具合で from typing import Union, Sequence, List, Tuple var: Union[Sequence[List], Sequence[Tuple]] ``` 既に調べられているかもしれませんが、1ヶ月前の Stackoverflow に 似たような質問が上がってました。 > Python type hinting can't exclude types. > You can't exclude Nones, strs or any another type. > > The only thing you can use to try to emulate None exclusion > is to use Union and write every type you are actually using in the dictionary. > > https://stackoverflow.com/questions/57854871/exclude-type-in-python-typing-annotation
nikori

2019/10/30 04:45

コメントありがとうございます。 除外ができないこと、Unionで結合ができることは把握しておりましたが、 型ヒントの利用上、「numpyのマニュアルでいうところのarray_likeな型」ならばなんでもよい、という状況は多いかと思ったので、標準で実現されていないか気になったという次第です。 ありがとうございました。
nico25

2019/10/30 05:39

いえいえ、お役に立てず口惜しい限りです :)
nikori

2019/10/30 05:46

いえ!ご丁寧にありがとうございました!
guest

回答1

0

ベストアンサー

numpy.ndarrayを除くと、

plain

1SequenceNotStr = Union[List[str], Tuple[str, ...]]

で済みそうです。

python

1#!/usr/bin/env python 2from typing import List, Tuple, Union 3 4SequenceNotStr = Union[List[str], Tuple[str, ...]] 5 6 7def a(foo: SequenceNotStr): 8 return len(foo) 9 10 11if __name__ == '__main__': 12 a([1, 2, 3]) # 12 13 a(['a', 'b']) 14 a((1, 2, 3)) # 14 15 a(('a', 'b')) 16 a("abc") # 16 17 a(list("abc"))

結果

plain

1% mypy seq_typing.py 2seq_typing.py:12: error: List item 0 has incompatible type "int"; expected "str" 3seq_typing.py:12: error: List item 1 has incompatible type "int"; expected "str" 4seq_typing.py:12: error: List item 2 has incompatible type "int"; expected "str" 5seq_typing.py:14: error: Argument 1 to "a" has incompatible type "Tuple[int, int, int]"; expected "Union[List[str], Tuple[str, ...]]" 6seq_typing.py:16: error: Argument 1 to "a" has incompatible type "str"; expected "Union[List[str], Tuple[str, ...]]" 7Found 5 errors in 1 file (checked 1 source file)

参考
https://github.com/python/cpython/blob/v3.7.5/Lib/_collections_abc.py#L926
https://github.com/python/cpython/blob/v3.7.5/Lib/_collections_abc.py#L1010

投稿2019/10/29 10:11

quickquip

総合スコア11231

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nikori

2019/10/30 06:14 編集

ご回答ありがとうございます。 参考としていただいたソースコードを読んだのですが、 あるクラスが抽象基底クラスに属するかどうかは、実装レベルの段階からリストアップ形式なのですね。 また、サンプルコードもありがとうございます。 数値計算の文脈で利用したいため、numpy.ndarrayが含まれていてほしいのですが、 標準の型ではないため難しそうですね...。 ご教授いただきました内容で、かなり問題の見通しがよくなり、 numpy.ndarrayをジェネリック化したNDArrayを定義し、Union[List[str], Tuple[str], NDArray[str,...]]などとすれば私の実施したいことが実現できるのかもしれないと思いました。 現状上手くいっていないのですが、研究してみようと思います。 取り急ぎお礼申し上げます。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問