質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

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

Elm

Elmは、Functional Reactive Programming(FRP)という概念を持つプログラミング言語です。JavaScriptにコンパイルされており、高度な対話型プログラムを簡単に作成するこができます。

Q&A

解決済

3回答

2011閲覧

python で type の設計

Kentaro0919

総合スコア258

Python 3.x

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

Elm

Elmは、Functional Reactive Programming(FRP)という概念を持つプログラミング言語です。JavaScriptにコンパイルされており、高度な対話型プログラムを簡単に作成するこができます。

0グッド

2クリップ

投稿2018/06/28 07:49

編集2018/06/29 08:34

3.7 のリリースでtypeが改善されているらしいと読んだので、ドキュメンを確認していたのですが。 自分で新しいtypeを作るときどうしたらいいのですか。

他の言語ですが、elmだたこのようなものがあります。
Elm Union types

Elm

1 2type Answer = Yes | No

やりたいのは  TOP か ALL を受け取り、200だった場合はListを返す関数の場合のtypeを自分で定義することです。

python

1 2TOP = NewType('TOP', str) 3ALL = NewType('ALL', str) 4Depth = Union[TOP, ALL] 5 6Contract = NewType('Contract', str) 7Contracts = Union[List[Contract], None] 8 9def get_list_contracts(depth: Depth) -> Contracts: 10 """ Contract API Resources depth is TOP or ALL""" 11 r = s.get(urljoin(BASEURL, 12 f'/contract-api/v1/contracts/identifiers?depth={depth}')) 13 return r.json() if 200 == r.status_code else None 14 .....

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

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

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

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

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

quickquip

2018/06/29 06:15

"やりたいのは  Yes か No を受け取り、200だった場合はListを返す関数の場合" と ソースに関連がないんですが、やりたいことのイメージはソースの方ですか?
Kentaro0919

2018/06/29 08:38

ご指摘有難うございます。 コード自体は正しく動いているコードで それにtypeを追加していきたいというのが希望です、ここの関数は短く、受け取っているのが2つにきまっているのですがboolではないので、その場合はどう書くのか 質問です
quickquip

2018/06/29 08:49

このコードは「こんな感じのことができたらいい(けどまだ変な)」コードのイメージ」ですか? 「今こう書いてみている(けどまだ変な)コード」ですか?
Kentaro0919

2018/06/29 09:06 編集

このコードはtypeなし版は正しく動いています。 これにtype をつけるならどうすればいいのですか? 引き数の可能性は2つしかないのですが、その場合typeはそうするのですか? boolは根拠もなく、違和感があるのです、bool が良いんですか? 自分で書いてみたんですけど、他の人が読むと変ですか?  type に価値を感じるのですが、どうか書いたらいいのかよく分かっていません。
quickquip

2018/06/29 09:10 編集

動いているコードはまったくtypeヒントがついてない(つまりこのコードからtypeヒントを全部取っ払った)状態なんでしょうか。元は、strを引数にとって、strのリストかNoneを返す、という関数なんですね。
Kentaro0919

2018/06/29 09:22

はい それが現状です。それでも動いているんですけど、渡すのはDepthのうちどちらか、返しているのは str のリストじゃなくて 意味のわかる Contracts  にして可読性をあげられればと思っています
guest

回答3

0

これでどうでしょう。

python

1from typing import NewType 2 3 4Answer = NewType("Answer", bool) 5Yes, No = Answer(True), Answer(False) 6 7 8def test(ans: Answer): 9 pass 10 11 12test(Yes) 13test(No) 14test(True) 15test(False) 16test(1) 17test(0) 18test(None) 19test("Yes")

mypy結果

test.py:14: error: Argument 1 to "test" has incompatible type "bool"; expected "Answer" test.py:15: error: Argument 1 to "test" has incompatible type "bool"; expected "Answer" test.py:16: error: Argument 1 to "test" has incompatible type "int"; expected "Answer" test.py:17: error: Argument 1 to "test" has incompatible type "int"; expected "Answer" test.py:18: error: Argument 1 to "test" has incompatible type "None"; expected "Answer" test.py:19: error: Argument 1 to "test" has incompatible type "str"; expected "Answer"

個人的な感想

test(True)test(False)もmypyを通らないのはちょっと意外でした。

投稿2018/06/28 10:09

YouheiSakurai

総合スコア6142

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

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

Kentaro0919

2018/06/28 14:23

この場合要素が2つだから それでもいけるのかと思ったんですけど、じゃあ要素が3つ以上になったら? そもそもBoolは違うのかと思ったんですよね むしろ こうなんですねか Depth = NewType("Depth", str) TOP, ALL = Depth("TOP"), Depth("ALL")
YouheiSakurai

2018/06/28 15:49 編集

非対称だったり3つ以上だったりするんだったらenumでいいんじゃないですか?
guest

0

ベストアンサー

Elmでのtype Answer = Yes | NoはAnswerが型で、YesとNoがコンストラクタですが、
PythonでAnswer = Union[Yes, No]と書いたら、AnswerもYesもNoも全部で、値は別に必要です。

def_type.py

Python

1from typing import List, NewType, Union 2 3Top = NewType('Top', str) # これは型 4All = NewType('All', str) 5 6Depth = Union[Top, All] 7 8TOP = Top('TOP') # これはインスタンス 9ALL = All('ALL') 10 11Contract = NewType('Contract', str) 12Contracts = Union[List[Contract], None] 13 14 15def get_list_contracts(depth: Depth) -> Contracts: 16 return [Contract(f'/contract-api/v1/contracts/identifiers?depth={depth}')]

と定義して

Python

1from def_type import ALL, TOP, get_list_contracts 2 3get_list_contracts(TOP) 4 5get_list_contracts(ALL) 6 7# mypyやPyCharmで警告がでる(がもちろん実行できる!!) 8get_list_contracts('ALL')

とするのがいいのでは。


もっとも

Python

1from typing import List, NewType, Union 2 3Depth = NewType('Depth', str) # これは型 4 5TOP = Depth('TOP') # これはインスタンス 6ALL = Depth('ALL') 7 8Contract = NewType('Contract', str) 9Contracts = Union[List[Contract], None] 10 11 12def get_list_contracts(depth: Depth) -> Contracts: 13 return [Contract(f'/contract-api/v1/contracts/identifiers?depth={depth}')]

で十分でしょ、と思います。


私は、strを渡すと実行時エラーが出る分Enumの方が好ましく思いますが。

def_enum.py

Python

1from enum import Enum 2from typing import List, NewType, Union 3 4 5class Depth(Enum): 6 Top = 'TOP' 7 All = 'ALL' 8 9 10Contract = NewType('Contract', str) 11Contracts = Union[List[Contract], None] 12 13 14def get_list_contracts(depth: Depth) -> Contracts: 15 return [Contract(f'/contract-api/v1/contracts/identifiers?depth={depth.value}')]

と定義して

Python

1from def_enum import get_list_contracts, Depth 2 3 4get_list_contracts(Depth.Top) 5 6get_list_contracts(Depth.All) 7 8# mypyやPyCharmで警告がでて、実行時エラーにもなる 9get_list_contracts('ALL')

投稿2018/06/29 14:20

編集2018/06/30 00:10
quickquip

総合スコア11029

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

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

Kentaro0919

2018/06/29 22:55

quiquiさん 腑に落ちました、enumもとってもメリットがありそうですね。 有難うございます。
guest

0

やりたいことは特別な型を使わずとも Enum で解決すると思うのですが…。

投稿2018/06/28 08:04

mather

総合スコア6753

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

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

Kentaro0919

2018/06/28 08:07

type を使って バグが他のところで入り込むのを阻止したいので その回答ではあまり意味がないようです サンプルのコードはタイプをぬいて普通に動いているのですが 引数を間違えたりを阻止したいと思っています
mather

2018/06/28 08:24

意味がない、と感じるなら無視していただいていいのですが、Pythonでは型ヒントのみなので実行時には型の情報は役に立たないのでお気をつけください。
Kentaro0919

2018/06/28 08:36

表現が拙くて嫌な思いをさせてすみません。 from enum import Enum Depth = Enum('Depth', 'TOP ALL') 確かにこれでもmypyは満足するようで、何も言われないようです。
mather

2018/06/28 08:41

いえ、なぜかはわかりませんが、Enumをすごく誤解してます。これは型ヒントではありません。 https://docs.python.org/ja/3/library/enum.html#module-enum from enum import Enum, auto class Depth(Enum): TOP = auto() ALL = auto() Depth.TOP Depth.ALL 使い方はよく調べてみてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問