2023/03/13 Pythonで色々やってる
from 2023/03/13
Mijikko.icon
Pythonの拡張機能よくばりセットがあったので入れちった
https://gyazo.com/19376ee71ab0f117a913839778afce7f
Python Extension Pack
https://marketplace.visualstudio.com/items?itemName=donjayamanne.python-extension-pack
https://qiita.com/domodomodomo/items/6df1419767e8acb99dd7
サンプルコードの変数名、関数名を全部日本語で書いてるの好き
コーディングに慣れた人だと英語で書くのが当たり前になってしまうけれど、初心者に対しては日本語で書いたほうがいいのかも…?
せっかくPythonやJavaScriptは日本語対応しているんだし
よくわからないのですが、これ、インデントに全角スペースを使っても大丈夫なんですか? suto3.icon
全角スペースのインデントは流石に構文エラー出ますMijikko.icon
変数などの名前に全角文字を使えるというだけですね
JavaScriptのコールバック関数に慣れたらPythonでも同じように書こうとしてしまう
以下は大体同じ動きをするっぽい
code:callback.ts
function callback_test() {
let callback_test = 0;
function callback(): number {
callback_test += 1;
return callback_test;
}
recieve_callback(callback); // 1
recieve_callback(callback); // 2
}
function recieve_callback(func: () => void) {
console.log(func());
}
callback_test();
code:callback.py
from typing import Callable
def callback_test():
callback_test = 0
def callback() -> int:
nonlocal callback_test
callback_test += 1
return callback_test
recieve_callback(callback) # 1
recieve_callback(callback) # 2
def recieve_callback(func: Callable[[], None]):
print(func())
callback_test()
関数(クロージャー)の外で定義した変数を読み書きするテスト
Pythonではnonlocalをつけないと代入時にエラーが出る
読み込むだけならつけなくても良いっぽい
sleepにawaitを付け忘れる事故をn回やらかしている
この差は何?Mijikko.icon
coroutineを変数の中に入れ、後にawaitしたパターン
最後の「終わるよ」以外何も出力しない
ループが何も実行されなかった説、またはmain()のawaitにブロッキングされた説が濃厚
awaitされるまで動作しないなんて同期処理と何ら変わらない気がするけれど、何かあるのだろうか
何か(問題が | 解決策が | 別の用途が | 知らない概念が)あるのだろうか
code:class1.py
from asyncio import sleep, run, create_task
class SampleClass:
def __init__(self):
self.foo = 0
self.is_release = False
self.coroutines = [
self.loop(),
self.incrementer(),
]
async def loop(self):
""" 無限にself.fooの値を出力し続ける """
while not self.is_release:
print(self.foo)
await sleep(0.5)
async def incrementer(self):
""" 無限にself.fooの値に1加える """
while not self.is_release:
self.foo += 1
await sleep(0.5)
async def release(self):
""" 無限ループを停止する """
self.is_release = True
for c in self.coroutines:
await c
async def main():
s = SampleClass()
await sleep(2)
print("終わるよ")
await s.release()
if __name__ == "__main__":
run(main())
Taskを作成して後でawaitしたパターン
0\n1\n2\n3\n終わるよを出力して終わる
想定通りの動作をしている
code:class2.py
from asyncio import sleep, run, create_task
class SampleClass:
def __init__(self):
self.foo = 0
self.is_release = False
self.coroutines = [
create_task(self.loop()),
create_task(self.incrementer()),
]
async def loop(self):
""" 無限にself.fooの値を出力し続ける """
while not self.is_release:
print(self.foo)
await sleep(0.5)
async def incrementer(self):
""" 無限にself.fooの値に1加える """
while not self.is_release:
self.foo += 1
await sleep(0.5)
async def release(self):
""" 無限ループを停止する """
self.is_release = True
for c in self.coroutines:
await c
async def main():
s = SampleClass()
await sleep(2)
print("終わるよ")
await s.release()
if __name__ == "__main__":
run(main())
別の検証(呼び出し後にselfを変えても大丈夫か)もしたかったので少々冗長
型定義を強制化できるやん!Mijikko.icon
https://gyazo.com/3c9b42d4c8fe7e219055a12cbfd9dd49
https://gyazo.com/b7d83cfd2f90c01061c1c8aba010da80
Pylanceを使った
Pylance - Visual Studio Marketplace
他にはmypyがある
2023/3/14 03:02 Pylanceはコマンドから実行できないっぽいので結局mypyに統一した
参考
Pythonの静的型をするvscode拡張: Pylance, Pyright, mypyの違い - kamocyc’s blog
(Python)PylanceのVS Code拡張機能をさっそく使ってみた。 - Qiita
https://gyazo.com/e506b96a926a66c78c21cde8cac16711
はぁ?wMijikko.icon
なんでクラス名を""で囲んだらクラス名の型ヒントになるんだよ
pythonの型ヒントで自作クラスを指定したい
PEP 484あたりに書いてあるらしい
PEP 484 – Type Hints | peps.python.org
Forward references
When a type hint contains names that have not been defined yet, that definition may be expressed as a string literal, to be resolved later.
前方の参照
型ヒントがまだ定義されていない名前を含む場合、その定義は文字列リテラルで書くことによって後々に解決されます。
#Python内で未定義と言われたクラスを型ヒントに使う方法