過去の日記

2019-05-17

指定必須なキーワード引数 [Python]

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-05-20

Linuxでファイル大量移動 [tech]

とかで検索すると

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{} を使う方法を紹介するのはリーズナブルで、「間違い」とか「そんなもの紹介しちゃだめ」ということでは決してない。