BETA

【python3】変数名をキーとして文字列のformatを行う

投稿日:2019-11-02
最終更新:2019-11-02
※この記事は外部サイト(https://qiita.com/kizul/items/052cd478ba34...)からのクロス投稿です

実装した関数

from inspect import currentframe,getargvalues  

def varfmt(target,*argv):    
    return target.format(**getargvalues(currentframe().f_back).locals)    

【※追記※】Qiitaコメント欄の@shiracamus さんより、python3.6以降なら以下の書き方でOKとのコメントを頂きました。
ありがとうございます!

def HogeAaPrint(hoge, aaa):  
    print(f"{hoge} {aaa}")  

HogeAaPrint(10, 20)  

[参考]
https://qiita.com/AnchorBlues/items/f7725ba87ce349cb0382
https://docs.python.org/ja/3/library/inspect.html

example

from inspect import currentframe,getargvalues  

def varfmt(target,*argv):    
    return target.format(**getargvalues(currentframe().f_back).locals)    


def HogeAaPrint(hoge,aaa):  
    print(varfmt("{hoge} {aaa}",hoge,aaa))  

HogeAaPrint(10,20)  

このように、変数名をキーとして文字列のformatを行うことが出来ます。

概要

昔々ある所に、プログラミングを生業とする一人の若者がおりました。

若者が気晴らしに街を歩いていると、前から歩いてきた見知らぬお爺さんに声を掛けられます。

お爺さん「そこの若いの、すまんがディレクトリパスを引数に渡すと、そのディレクトリのファイル一覧を返す関数をくれんかのう?」

若者は一つ返事で承諾し、お爺さんに以下の関数を渡しました

import glob  
def GetFileList(dirPath):  
    return glob.glob("{dirPath}/*".format(dirPath = dirPath))  

関数を受け取ったお爺さん。最初は喜びの顔を見せていたものの
しばらくすると怪訝な顔に、どうやら何かを悩んでいるようです。

数分後、おじいさんは突然ハッとした顔になり、若者へこう告げました。

爺さん「おおそうじゃ!実はファイルの拡張子も同時に指定したかったんじゃ!いやはや忘れておったわい!」

それ聞いた若者は「それならば」と以下の関数を渡しました。

import glob  
def GetFileList(dirPath,ext):  
    return glob.glob("{dirPath}/*.{ext}".format(dirPath=dirPath,ext=ext))  

受け取ったお爺さん、子供のように大喜び。
若者に一言感謝の言葉を告げ、大はしゃぎで家に帰っていきました。

それを見ていた近所の子供。お爺さんを羨ましそうに眺めながら、若者のそばに駆け寄ります。

子供「さっきおじいちゃんが貰ってた関数、ぼくも欲しい!」
子供「けどねお兄ちゃん、ぼくはディレクトリを必ず2階層分引数で取った上、ファイル名と拡張子を別々で指定できる関数が良いんだ!」

少し困った若者でしたが、かわいい子供の頼みです。「まかせろ!」と返答し以下の関数を渡しました。

def GetFileList(firstDirPath,secondDirPath,fileName,ext):  
    return glob.glob("{firstDirPath}/{secondDirPath}/{fileName}.{ext}".format(firstDirPath=firstDirPath,secondDirPath=secondDirPath,fileName=fileName,ext=ext))  

子供「わぁい!ありがとうお兄ちゃん!」

関数を貰った子供は大喜び。両親と周りの子供達の下へ駆け寄り、自慢気に関数を掲げます。
羨ましがる子ども達、欲しそうに見つめる子供の両親。若者の関数の話はまたたく間に街中へ広がりました。

数時間後、話を聞いた街の住民が一斉に若者の下へ駆け寄ります。

主婦「私はディレクトリを3つ指定したいんだけど、お願いできるかしら?」
近所のガキ大将「俺は名前前半と後半がアンダーバーで別れているファイルを対象にして取得したいぞ!」
隣国の皇帝「汝、実行ディレクトリ以下の指定パスファイルの一覧取得関数を作成し、我に納めよ。もちろん褒美は弾もうぞ。」

若者はてんやわんや。引数が増えるだけならまだしも、formatに指定するキーワードが増えるに従って、タイピング量は増えていきます。

def WifeRequest(firstDirPath,secondDirPath,thirdDirPath,fileName,ext):  
    return glob.glob("{firstDirPath}/{secondDirPath}/{thirdDirPath}/{fileName}.{ext}".format(firstDirPath=firstDirPath,secondDirPath=secondDirPath,thirdDirPath=thirdDirPath,fileName=fileName,ext=ext))  

def GeneralRequest(firstDirPath,secondDirPath,firstFileName,secondFileName,ext):  
    return glob.glob("{firstDirPath}/{secondDirPath}/{firstFileName}_{secondFileName}.{ext}".format(firstDirPath=firstDirPath,secondDirPath=secondDirPath,firstFileName=firstFileName,secondFileName=secondFileName,ext=ext))  

import os  
def EmperorRequest(firstDirPath,secondDirPath,fileName,ext):  
    return glob.glob("{executeDirPath}/{firstDirPath}/{secondDirPath}/{fileName}.{ext}".format(executeDirPath=os.path.dirname(os.path.abspath(__file__)),firstDirPath=firstDirPath,secondDirPath=secondDirPath,fileName=fileName,ext=ext))  

リクエストに答えた後も、更に降りかかるリクエストの数々…
期待に答えるべくキーボードを打ち続けた若者は、その後腱鞘炎となり会社を休むことになりましたとさ。

疑問:若者はどうすれば良かったのか

そうです、冒頭で紹介した関数を使えば良かったのです。

import os,glob  
from inspect import currentframe,getargvalues  

def varfmt(target,*argv):    
    return target.format(**getargvalues(currentframe().f_back).locals)    

def EmperorRequest(firstDirPath,secondDirPath,fileName,ext):    
    executeDirPath = os.path.dirname(os.path.abspath(__file__))  
    return glob.glob(varfmt("{executeDirPath}/{firstDirPath}/{secondDirPath}/{fileName}.{ext}",firstDirPath,secondDirPath,fileName,ext,executeDirPath))  

タイピング量が減ったお陰で次の日も出社出来ます。やったね。

補足

誤り指摘、マサカリ、苦情、投石等々大歓迎です。

後書き

後半は実体験です。

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

@kizulの技術ブログ

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる
技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
or 外部アカウントではじめる
10秒で技術ブログが作れます!