文をそのままコマンドとして実行するときの書き方「exec」【Python勉強中】


このエントリーをはてなブックマークに追加

ここからちょっと広告です。

広告は以上です。

これはメモです。同じ悩みを抱える人には救世主かもしれないけど、人類の99.999%にはただの怪文書だよ。

いつもの『退屈なことはPythonにやらせよう』 の、前回諦め宣言をしたばかりの11章を性懲りもなくやっています。
今は演習11.10.3。こんな内容です。

2048のゲームを開き、上下左右のキーを繰り返し入力して自動で遊ぶプログラムを書きなさい

で、ハマったのが「上下左右のキーを入力する」の箇所。
どうせなら実行するたびにランダムに上下左右を実行しようとしたのが、迷いの森のはじまりでした。

最初は「arrows = ['Keys.DOWN', 'Keys.UP', 'Keys.LEFT', 'Keys.RIGHT']」というシーケンスを用意して、こんな風に書いていました。

html.send_keys(random.choice(arrows))

しかし、どうしても矢印がランダムに動かない。
何故だ、何故だ、と、PyCharmのDebugモードで延々と悩んでいたら、ふと、以下のような記述を発見したんですよね。

random.choice(arrows) = 'Keys.DOWN'

ああ、これはもしかしたら、たとえばKeys.LEFTだと、

期待→ html.send_keys(Keys.LEFT)
実際→ html.send_keys('Keys.LEFT')

になっているのかもしれない。

シーケンスからは文字列を取得したくないのです。Keys.LEFTはコマンドなので、実行したいのです。
でもクォーテーションで囲まれちゃうと、文字列になってしまう。
今回は、そういう罠なのかも。

どうやったらこのクォーテーションを取り除けるんだろう、と、また悩んでいたら、execというのを発見しました。
execというのは、文章をそのまま実行するそうです。

ならば最初に書いたシーケンスを、「arrows = ['html.send_keys(Keys.DOWN)', 'html.send_keys(Keys.UP)', 'html.send_keys(Keys.LEFT)', 'html.send_keys(Keys.RIGHT)']」と書き直して、random.choiceしたものをそのまま実行しちゃったらどうだろう?

で、書いたのが以下です。

2048を自動でプレイする;GitHub Gist
スクリーンショット 2021-01-25 22.02.40

ばんざい! 無事に動きました。

「コマンドを直接配列に書いて、それをランダムに取り出して実行する」。
なんという力技。もうちょっとエレガントな書き方があるような気がしますが……まあとりあえず教材を5行進めることができて、良かった良かった。

Ads by Google

コメント

コメントは、Twitterやはてブに、以下のボタンから本記事のアドレスつきでツイート/ブクマしていただくと、上にあるzenbackのウィジェットに反映されます。
  このエントリーをはてなブックマークに追加
または同ウィジェット内のFacebookコメントでお願いしますー。

Facebookのシェアは……されても誰だかわからないのですが、シェア自体は嬉しいので、下にボタンを置かせていただきます。よろしくお願いします。