LoginSignup
87
35

More than 5 years have passed since last update.

PythonでHello 世界(ザ・ワールド)止まった時の世界に入門してみる。ジョースターの末裔は必読

Posted at

きさま!(この投稿を)見ているなッ!

Pythonで Hello Worldこんにちは、世界 ならぬ、
Pythonで Hello The Worldこんにちは、「世界(ザ・ワールド)」
を実現します。

これからDIO様の止まった時の世界に入門される、
ジョースターの末裔の皆様に特にオススメな投稿です。

実施したいこと

スタンド(幽波紋)が見えない人にも分かるように説明すると、
現在時刻を取得する以下の関数に対して、

datetime.now()

「世界(ザ・ワールド)」と唱えることによって、
freezegunというライブラリを使うことによって、
何度 datetime.now() をやっても、
同じ値が返ってきてしまう状態(時が止まっている状態)を作ります。

な… 何を言っているのか わからねーと思うが 
おれも 何をされたのか わからなかった…
頭がどうにかなりそうだった… 催眠術だとか超スピードだとか
そんなチャチなもんじゃあ 断じてねえ

チャチなものでは断じてなく、
現在時刻を扱うようなコードをテストすること
世界(ザ・ワールド)の真の能力 本来の目的です。

実行結果

以下の結果は、
承太郎に時計を持たせて、現在時刻を5秒間隔で聞いています。
datetime.now を5秒ごとに呼び出して、結果を print

世界(ザ・ワールド)の発動後には、
同じ関数を呼び出しても、時刻が止まっている点にご注目

結果
承太郎、いま何時?
 今の時刻は、2018-09-15 00:48:42 だゼ
 今の時刻は、2018-09-15 00:48:47 だゼ
 今の時刻は、2018-09-15 00:48:52 だゼ
◆DIO「世界(ザ・ワールド)!!時よ止まれッ!!」
承太郎、いま何時?
 今の時刻は、2018-09-15 00:48:57 だゼ
 今の時刻は、2018-09-15 00:48:57 だゼ
 今の時刻は、2018-09-15 00:48:57 だゼ
◆DIO「そして時は動き出すッ!」
承太郎、いま何時?
 今の時刻は、2018-09-15 00:49:13 だゼ
 今の時刻は、2018-09-15 00:49:18 だゼ
 今の時刻は、2018-09-15 00:49:23 だゼ

↑中段の「2018-09-15 00:48:57」が繰り返されていますね。

まさに!「世界を支配する」能力

教えてやろう
「世界(ザ・ワールド)」の真の能力は・・・
まさに!「世界を支配する」能力だということを!

上の結果を出力したPythonコードを示します。
◆DIO様のセリフを挟んで合計3回、
全く同じ、「ask_jyotaro」関数が呼ばれていますが、
世界(ザ・ワールド)の発動中は、
承太郎は同じ時刻を答えている点に注目してください。

世界(ザ・ワールド)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#pip install freezegun で導入
import datetime, freezegun
from time import sleep

#承太郎が今何時か教えてくれる関数を定義
def Jyoutaro_Ima_Nanji():
    now_datetime = datetime.datetime.now()
    time_str   = now_datetime.strftime("%Y-%m-%d %H:%M:%S")
    jyoutaro_str = u" 今の時刻は、"+time_str+" だゼ"
    print(jyoutaro_str)
    return time_str

#5秒おきに3回聞いてみる関数を定義
def ask_jyotaro():
    print("承太郎、いま何時?")
    Jyoutaro_Ima_Nanji()
    sleep(5)
    Jyoutaro_Ima_Nanji()
    sleep(5)
    Jyoutaro_Ima_Nanji()
    sleep(5)

#実行してみる。
ask_jyotaro()

print("◆DIO「世界(ザ・ワールド)!!時よ止まれッ!!」")

#####以下時間の停止した世界######
#現在時刻で時間を停止する
the_world_date = datetime.datetime.now()

#止まった時の世界で、再度承太郎に時間を尋ねる
with freezegun.freeze_time(the_world_date):
    ask_jyotaro()

######止まった時の世界の終了######

print("◆DIO「そして時は動き出すッ!」")

ask_jyotaro()

##マジメな話では、以下のような感じでテストを実施できる
#with freezegun.freeze_time("2018-9-15 14:7:36"):
    #以下ではAssertionError
    #assert Jyoutaro_Ima_Nanji() == "2018-9-15 14:7:36"
    #以下はテストが通る
    #assert Jyoutaro_Ima_Nanji() == "2018-09-15 14:07:36"

通常、現在時刻を扱う関数をテストしようとすると、
その結果をどのようにチェックするのか、難しい所があります。
この方法を使えば、上記のように特定の日時であると偽装した状態で、
datetimeを動かすことが出来るようになります。

pip install freezegun 後に上記コードを実施するだけで、
簡単に世界(ザ・ワールド)を体感できます。

バ・・・バカな・・・か・・・簡単すぎる・・・あっけなさすぎる・・・

こんな投稿だけでやってみるなんて、無駄無駄無駄無駄無駄無駄無駄無駄無駄ァーーーッ

実際にやってみるには、
空気を吸って吐くことのように!
HBの鉛筆をベキッ!とへし折る事と同じようにッ
できて当然と思うことですじゃ!
大切なのは「認識」することですじゃ!
大切なのは「freezegun」でググることですじゃ!

スタンドを操るという事はできて当然と思う精神力なんですぞッ!
こういうことが出来るんだと「認識」しておくことが重要ですじゃ!
実際にやる時には詳細はググってくだされぃッ!

花京院!イギー!アヴドゥル!終わったよ…

人間は誰でも不安や恐怖を克服して安心を得るために生きる
名声を手に入れたり 人を支配したり 金もうけをするのも安心するためだ。
結婚したり 友人をつくったりするのも安心するためだ。
テストコードを書くのも、すべて自分を安心させるためだ。

そしてこの投稿が、『世界(ザ・ワールド)』の正体と
freezegunというライブラリの存在を、
試験終了チャイム直前まで問題を解いている受験生のような
必死こいた気分で教えてくれた。

現在時刻を扱う関数に対して、
freezegunを使ってテストすることにより、
永遠の安心感を得てくださいッ!

遥かなる旅路 さらば友よ

あるのはシンプルなたったひとつの思想だけだ…たったひとつ!
「勝利して支配する」!
Hello The World = こんにちは、「世界」 と言いたかった!
それだけよ…それだけが満足感よ!

『ネタに走る』『技術的にも意味ある内容にする』
「両方」やらなくちゃあならないってのが「Qiita」のつらいところだな
覚悟はいいか?オレはできてる。

「投稿する」と心の中で思ったならッ!
その時スデに行動は終わっているんだッ!
実は既に「ドラえもんネタも投稿してあった」なら使ってもいいッ!
⇒ どこでもドアを作ってみた物語

      ~~ To be Continued ~~

87
35
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
87
35