カテゴリーアーカイブ Python

著者:杉浦

【Python】PythonでSlackの通知を送る

 Slack開発元謹製のIncoming Webhookとライブラリslackwebを繋げることでとても楽にSlackへ通知を送ることが出来ます。
 どのくらい簡単かというと次のコードで実装できるくらいです。

import slackweb


slack = slackweb.Slack(url="Incoming Webhookで発行したURL")
slack.notify(text="python to slack")

 Slackに登録し、チャンネルを扱える状態で Incoming Webhook | Slack App ディレクトリへ移動。設定を追加で移動した画面からインテグレーションの追加を押すと、URLが発行されます。


 後は先のコードの様に通知を送るだけです。

  • この記事いいね! (1)
著者:杉浦

Pythonのグローバル変数の命名における慣習

 Pythonはファイル全体をスコープとした記述が出来、例えば次の三行だけのファイルを動かせます。

print('---')
print('Hello, World!')
print('---')

 インタプリタらしく一行一行コマンドを読み込み、実行していく感じです。この一行一行がくせもので必ずファイル全体をスコープとしたグローバル環境にコードを記述する必要があります。例えば関数を定義して呼び出す際、最後はグローバルから呼び出すことになります。

def hello_world():
    return 'Hello, World!'


hello_world()

 この仕様によるグローバル汚染を防ぐためにPythonにはいくつか慣習があります。例えば、実行ファイル以外のコードが不意に走ることを防ぐためのif文があります。

def hello_world():
    return 'Hello, World!'


if __name__ == '__main__':# このファイルがメインの実行ファイルならばtrue
    hello_world()

 同じ様にグローバル変数には命名の慣習があり、ローカル内で誤ってグローバル変数を参照することを避けます。内容はいたってシンプル、先頭の_です。

def hello_world():
    return 'Hello, World!'


_msg = hello_world()
if __name__ == '__main__':# このファイルがメインの実行ファイルならばtrue
    print(_msg)

 この様にすることで複数ファイルを連携させた際に参照したい変数、参照したくない変数を操りやすくします。この慣習は根付いており、Python実行ファイル上において_hogeな変数とfugaな変数は同等に扱われるにもかかわらず、IDE等のPython対応のエディタにおいて_hogeな変数はグローバル変数用の扱い、fugaな変数はローカル変数用の扱いと区別されます。

  • この記事いいね! (0)
著者:杉浦

Pythonのrequestsでmultipart/form-data形式通信を行う

 multipart/form-dataは文書、ファイル、またはバイト列の性質や形式を示す標準の一つです。multipart/form-dataは複数の部分から成るHTMLフォームのデータです。
MIME タイプ – HTTP | MDN #multipartform-data
 multipart/form-dataはごちゃまぜの種類のデータをまとめて送る時に便利です。これをどうやって使うかですがJavaScriptならば描画しないフォームを作り、それを送ることができます。次のコードはある画像ファイルとその画像ファイルの加工データを送信するのコードの一部です。JavaScriptはHTMLを扱う機能が数多く備わっており、フォーム形式の通信もJavaScript単独でパパっと書けます。

const formData = new FormData();// フォーム作成
formData.append('original_file', this.file);// フォームに値を入力
formData.append('cropped_file', croppieResponse);// フォームに値を入力

// multipart/form-data形式を指定して通信
axios.post(this.uploadDistUrl,
    formData,
    {
      headers: {
        'Content-Type': 'multipart/form-data',
      },
    }
).then((uploadImgResponse) => {
  // 通信成功時処理
}).catch(() => {
  this.vodalMsg = '通信に失敗しました。';
});

 pythonにはrequestsというHTTP通信用ライブラリがあります。これは人間に優しいを謳い文句にするくらい簡単に動かせることが特徴です。どのくらい楽かというと次の読みやすいインデント、改行の10行ないコードだけのファイルでpostを投げられるくらいです。

import requests

request_data = {
    'id': 'hoge',
    'password': 'fuga',
}

response = requests.post('http://127.0.0.1:8000/api/hoge', params=request_data)
print(response)

 便利なrequestsでmultipart/form-dataで送る方法を調べたところ次のコードで実現できました。
Quickstart — Requests 2.21.0 documentation#post-a-multipart-encoded-file

import requests

request_data = {
    'id': 'hoge',
    'password': 'fuga',
}
files = {'image': ('hoge_image',
                   'data:image/png;base64,000000000',
                   'image/png')}

response = requests.post('http://127.0.0.1:8000/api/hoge', params=request_data, files=files)
print(response)

 filesの様に色々形式毎の引数を用意して渡せば、まとめてよしなに送信してくれます。とてもとても便利ですね。

  • この記事いいね! (0)
著者:杉浦

pythonの人間のためのHTTPライブラリRequests

 Requests: HTTP for Humans™ — Requests 2.20.1 documentation
 requests · PyPI
 Requestsは人間に優しいHTTP通信用ライブラリです。ちょっとしたリクエストをAPIに送る時などに便利です。次のコード例はbacklogの課題追加APIです。backlogの課題はまとめて追加することが多くいちいちUIで記述をするのは面倒です。APIでまとめて送ることで楽が出来ます。

import requests

BACKLOG_URL = "https://hogehoge.backlog.jp/api/v2/issues"
API_KEY = "hogehogefugafuga"
PROJECT_ID = 104607  # プロジェクトID
ISSUE_TYPE_ID = 485681  # 課題種別ID
CATEGORY_ID = 279257  # カテゴリID
PRIORITY_ID = 3  # 優先度
ASSIGNEE_ID = 251977  # ユーザID

request_data = [
    {
        'summary': '会員登録機能',
        'startDate': '2018-12-07',
        'endDate': '2018-12-08',
    }, {
        'summary': '会員削除機能',
        'startDate': '2018-12-08',
        'endDate': '2018-12-09',
    }
]
for data in request_data:
    BACKLOG_PARAMS = {
        'apiKey': API_KEY,
        'projectId': PROJECT_ID,
        'summary': data['summary'],
        'issueTypeId': ISSUE_TYPE_ID,
        'categoryId[]': CATEGORY_ID,
        'priorityId': PRIORITY_ID,
        'startDate': data['startDate'],
        'endDate': data['endDate'],
        'estimatedHours': 7,
        'assigneeId': ASSIGNEE_ID,
    }

    response = requests.post(BACKLOG_URL, params=BACKLOG_PARAMS)
    print(response)

 requetsでリクエストを送るのは簡単です。送信メソッド毎(get,post,put,patch,delete)のメソッドがrequests内に用意されており、それの引数に文字列のURLと辞書型のボディを渡すだけです。これだけの設定でファイルを実行するとリクエストが送られます。
 細かい設定、細かい結果の取得も簡単にできます。

>>> r = requests.get('https://api.github.com/user', auth=('user', 'pass'))
>>> r.status_code
200
>>> r.headers['content-type']
'application/json; charset=utf8'
>>> r.encoding
'utf-8'
>>> r.text
u'{"type":"User"...'
>>> r.json()
{u'private_gists': 419, u'total_private_repos': 77, ...}
  • この記事いいね! (0)
著者:杉浦

Pythonやjavascriptで現れる__の通称

 Double UNDERsocoreを略してdunderと読みます。発端は How do you pronounce “__” (double underscore)?らしいです。発端はどうあれ今はgoogleで`dunder __`と検索すると10万件以上ヒットするほど使われています。
 Pythonやjavascriptには__で囲われた変数が現れます。

__name__

__proto__

などです。この__は予約された変数で、プログラムを実行した時点ですでに中身が設定されている変数です。必然、中身を調べるわけですが、検索エンジンによっては__を読み取ってくれないことがあります。dunderはそのような時に助けなってくれる呼び方です。
 javascriptでは__proto__以外で__の絡んだ値をそうそう扱わないですが、pythonはまま使います。その中でもよく使うのは以下のあたりです。

class hogehoge
	def __init__(self, hoge, fuga):
		#コンストラクタ定義
if __name__ == '__main__':
	# メイン実行の関数呼び出し

 __init__はコメントの通りclassのコンストラクタ定義。if __name__ == ‘__main__’:は直接実行(__name__ = __main__)されているか、他ファイルから呼び出されてい実行(__name__ = ファイル名)されているかで場合分けです。過去のプログラムの一部を使いたい時はよくありますので、その時に備えて書いたりするわけです。

  • この記事いいね! (0)
著者:杉浦

Pythonの紹介

 Pythonは次の謳い文句で宣伝されているプログラミング言語です。

Python is a programming language that lets you work quickly and integrate systems more effectively.

 Pythonは膨大なライブラリと短く単純な文法が特徴の言語です。lets you work quicklyという部分は、素早いコーディングを実現させる、という訳が適当だと思います。
 現在の最新安定版である3.7の標準ライブラリのリファレンスはPython 標準ライブラリ — Python 3.7.1rc1 ドキュメントです。標準ライブラリとある通り、Pythonには最初からこれらの40章近くからなる幅広い関数が用意されています。この関数には高級なものが多くあり、この標準ライブラリを使うだけで簡単にコードを記述できます。例えば、あるurl(src_url)に置いてあるデータを取得して、ファイル(dst_file)に保存する動作は次の三行で記述できます。

data = urllib.request.urlopen(src_url).read()
with open(dst_file, mode="wb") as f:
    f.write(data)

 この様に何か簡単な課題を解決するためにちょちょいとプログラミングするという目的にpythonは非常に適しています。また容易にコーディングが可能という利点は、機械学習関連の学者、研究者の様なプログラミングが必須であるが、プログラミング以外の部分を主に考えたい人達にも人気の様です。少なくともユーザは増えています。スクリプト言語をいくつか比較したgoogle trendが次の画像です。

 標準ライブラリのみでは足りない時はPyPI – the Python Package Index · PyPIを参照しましょう。このサイトには数多くの外部ライブラリがアーカイブされています。
 便利なpythonですが、実行速度が遅いという欠点もあります。ループ速度の比較がヒットする様にググるとpython敗北の記事はいくつも出てきます。

  • この記事いいね! (0)