Pythonは好きじゃない

・配列で要素を追加するときはappendじゃなくてpushじゃないの?

 過去に議論があったようだが英語がよくわからない。。
 https://stackoverflow.com/questions/1566266/why-do-python-lists-have-pop-but-not-push
 スタックが実現したいならそれ用のクラスを作りなさいって言ってる?

 https://docs.python.org/ja/3/library/array.html

 アレイはシーケンス (sequence) 型であり、中に入れるオブジェクトの型に制限があることを除けば、リストとまったく同じように振る舞います。

 [1,2,3]
 とあったときに、これはリスト?配列?
 リストに対して追加なら、appendでいいと思うが、
 配列ならpushの方がいいのではないか?


・内包表記のインデントにルールがない


Perl
 if ($var =~ /foo(.+)/) {
  # do something with $1
 } elsif ($var =~ /bar(.+)/) {
  # do something with $1
 } elsif ($var =~ /baz(.+)/) {
  # do something with $1
 }
 をPythonで書くのがつらい

 https://stackoverflow.com/questions/122277/how-do-you-translate-this-regular-expression-idiom-from-perl-into-python

 if文の条件式内で代入ができるようにしないのかな?


・joinが文字列型のメソッドである

通常、処理の対象になる配列やリストのメソッドにするんじゃないの?

joinを文字列にするんだったら、整数の総和とかもintのメソッドにしなくていいの?
例えば、こんな感じに

>>> INT.sum([1,2,4,[5,6,[10,20]]])
48
>>> INT.sum((1,2,4,(5,6,(10,20))))
48


・コマンド引数に数字を書いても文字列として扱う

(sum.py)

#!/usr/bin/env python3

import sys

sum = 0
for arg in sys.argv[1:]:
  sum += arg

print(sum)
$ ./sum.py 1 2 3
Traceback (most recent call last):
  File "./sum.py", line 7, in 
    sum += arg
TypeError: unsupported operand type(s) for +=: 'int' and 'str'

例外が発生する。。pythonは動的型付けをうたってるんじゃないの?


・よくはまる

MariaDBからデータをとってくるスクリプトを実行したらエラーになった。
(mysql.py)

#!/usr/bin/env python3
import mysql.connector

conn = mysql.connector.connect(user='root', password='', host='localhost', database='test')
cur = conn.cursor()

cur.execute("select * from articles;")

for row in cur.fetchall():
    print(row)

cur.close
conn.close


実行結果

$ ./mysql.py 
Traceback (most recent call last):
  File "./mysql.py", line 2, in 
    import mysql.connector
  File "/home/fukumiya/test/python/mysql.py", line 2, in 
    import mysql.connector
ModuleNotFoundError: No module named 'mysql.connector'; 'mysql' is not a package


インポートしたモジュールと同じ名前のファイルが、同じディレクトリにあるといけない?

$ ls
__pycache__  mysql.py
$ mv mysql.py my_sql.py
$ ls
__pycache__  my_sql.py
$ ./my_sql.py 
(1, 'タイトル', 'これは、記事の本文です。', datetime.datetime(2019, 8, 15, 23, 22, 52), None)
(2, 'またタイトル', 'そこに本文が続きます。', datetime.datetime(2019, 8, 15, 23, 22, 52), None)
(3, 'タイトルの逆襲', 'こりゃ本当にわくわくする!うそ。', datetime.datetime(2019, 8, 15, 23, 22, 53), None)
$ touch mysql.py
$ ls
__pycache__  my_sql.py  mysql.py
$ ./my_sql.py 
Traceback (most recent call last):
  File "./my_sql.py", line 2, in 
    import mysql.connector
ModuleNotFoundError: No module named 'mysql.connector'; 'mysql' is not a package
$

むむ。こういう仕様なのか?

$ python3
Python 3.6.8 (default, May  2 2019, 20:40:44) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-36)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> print(sys.path)
['', '/usr/lib64/python36.zip', '/usr/lib64/python3.6', '/usr/lib64/python3.6/lib-dynload', '/usr/lib64/python3.6/site-packages', '/usr/lib/python3.6/site-packages']

カレントディレクトリを先に見ているからか?


はまってる人は何人かいるみたい。
PythonのModuleNotFoundErrorについて
https://teratail.com/questions/125683
ImportError: No module named 'MySQL'
https://stackoverflow.com/questions/32877671/importerror-no-module-named-mysql