2019-06-30 [長年日記]
■天冥の標
正味1週間ぐらいで5冊読み進めちゃって、しばらく飽和状態になってた。
道中はめちゃくちゃ面白くて一気に突き進んだのだ。
前の巻を読んでいる時「ダダーのノルルスカイン」で、ダダーが種族名でノルルスカインが個体名というような言説にわざわざ強調すること? と思ってたけど、あーそういうことかー、みたいな気になった。
ちりばめられた要素が収斂して幕引きに向かう過程というのは実はあまり好きじゃないのが自覚されたりした。
ミステリィの好きなところはその過程が瞬時に起きることが多いことなのかも。
2019-05-20 [長年日記]
■Linuxでファイル大量移動
とかで検索すると
find FROM_PATH -type f | xargs -I {} mv {} TO_PATH
みたいなのが検索結果の上の方にヒットするけど、
いやいや -I を指定したら -L 1 が自動的に適用されて、ファイルの個数分 mv コマンドが実行されるからめちゃくちゃ効率悪いよね??
という気持ちになる。
mv コマンドが、移動先を先頭にとればいいのだから……と調べてみたら、-t オプションがあった。
- t, --target-directory=DIRECTORY
全ての SOURCE 引数を DIRECTORY に移動する
ということで、
find FROM_PATH -type f | xargs -n 1000 mv -t TO_PATH
とかした方が、ファイル1000個につき mv コマンドが1回になって効率がよい。
私に限って言えばこちらの方が都合がよいことが多い。
ただしファイル名やディレクトリ名に空白が入っていない場合に限る。
一般論として、様々な条件下でも十分に動くコマンドとしては -I{} を使う方法を紹介するのはリーズナブルで、「間違い」とか「そんなもの紹介しちゃだめ」ということでは決してない。
2019-05-17 [長年日記]
■指定必須なキーワード引数
def foo(a, b, *, c): print(a) print(b) print(c)
と定義すると、
>>> foo(1, 2, 3) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: foo() takes 2 positional arguments but 3 were given foo() takes 2 positional arguments but 3 were given >>> foo(1, 2) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: foo() missing 1 required keyword-only argument: 'c' foo() missing 1 required keyword-only argument: 'c'
となって、キーワード引数なしで呼び出せなくなる。
>>> foo(1, 2, c=3) 1 2 3
という呼び出し方をする必要がある。
つまり、c は"キーワードで指定することが必須"でかつ"デフォルトの値を持たない"引数になったわけ。
2019-04-02 [長年日記]
2019-03-26 [長年日記]
■objectのインスタンスには属性をセットできません
>>> x = object() >>> x.foo = 1 Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'object' object has no attribute 'foo' 'object' object has no attribute 'foo'
なんで? と思った。
例えばobjectを継承しつつも一切なにもしないクラスを作って
>>> class Foo: pass >>> x = Foo() >>> x.foo = 1
とするのはなにも問題ない。
なぜobjectに属性を作る機能がないのか?
なぜobjectを継承しつつ特に何も動作を変えないクラスには属性を作る機能があるのか?
などということに長いこと引っかかっていたのだが、ドキュメントを読んでいて見つけてしまった。
注釈
object は __dict__ を 持たない ので、 object クラスのインスタンスに任意の属性を代入することはできません。
https://docs.python.org/ja/3.6/library/functions.html#object
しっかり明記してあった。
考えると、objectはすべてのクラスの親クラスなので、objectが__dict__を持っていたりすると
>>> a = int(100000000) >>> b = int(100000000) >>> a is b False >>> a.x = 'なんとか'; b.x = 'かんとか' # これは実際にはエラーになる
だとか
>>> x = 1 >>> x.hoge = 'なんとか' # これも実際にはエラーになる
だとか、組み込み型のあらゆる値に勝手に属性を差し込めることになってしまうので確かによくなさそう、と考え直したのだった。