pygmt.grdtrack()の引数順序

ここ2年ほどは地図情報の描画のために PyGMT を用いている. 「生 GMT 」のような特殊な記載を極力減らし, Pythonicな分かりやすい関数や引数が与えられている点は, (自分のような)GMTをあまり使っていない人にとっても恩恵を授かれる.

ここでは,PyGMTの関数 grdtrack() で少し気になった点を記載する.

PyGMTは2020年の Version 0.1.0 リリースから,約4ヶ月間隔でマイナーアップデートを行っており,2023年5月8日現在では Version 0.9.0 が最新である.初期バージョンではラッパーの種類が少なく,使用には苦労したが,現在はGMTの多くのコマンドがPyGMTに取り込まれており,既に十分実用的である.

一方,そのような開発の速さは,バージョン間のマイナーチェンジによる弊害を生むことも多い. grdtrack() は,gridファイルから指定した座標値の物理量を抽出する関数である.引数には,gridファイルのパスかDataArrayを指定するgridと,抽出したい座標値データを含むDataFrameなどを指定するpointsを指定する必要がある.

Version 0.6.1までは,次のような引数を取っていた.

  • v0.6.1のgrdtrack()
    grdtrack.py
    def grdtrack(points, grid, newcolname=None, outfile=None, **kwargs):
        r"""
        Sample grids at specified (x,y) locations. ...
    
        Parameters
        ----------
        points : str or {table-like}
            Pass in either a file name to an ASCII data table, a 2D
            {table-classes}.
    
        grid : xarray.DataArray or str
            Gridded array from which to sample values from, or a filename
            (netcdf format).

この関数では,第1引数にpoints,第2引数にgridを必ず与えなければならない.

一方,次のVersion 0.7.0では引数の取り方が変わっていた.

  • v0.7.0のgrdtrack()
    grdtrack.py
    def grdtrack(grid, points=None, newcolname=None, outfile=None, **kwargs):
        r"""
        Sample grids at specified (x,y) locations. ...
    
        Parameters
        ----------
        grid : xarray.DataArray or str
            Gridded array from which to sample values from, or a filename
            (netcdf format).
    
        points : str or {table-like}
            Pass in either a file name to an ASCII data table, a 2D
            {table-classes}.

この関数の記載では,必ず第1引数にgridを与える必要があり,pointsの与える位置は制約されない. ただし,関数を作用させるにはpointsまたはprofileのどちらかを指定する必要がある.

つまり,v0.6.1からv0.7.0以上にアップデートした場合,grdtrack()を使用していれば引数の順序を変える必要があるということだ.幸い,gridはnetCDF形式,pointsはtable形式のため,仮に順序を変えていなくてもエラーを吐いてプログラムは止まる.だが,これらのファイル形式などが同一の引数だった場合,エラーを吐かずに大きなバグを生み出している可能性がある.

…とはいえ,v0.6.1以前にWarningが出されていたかもしれない.見落としていたらそれまでだが,今後もPyGMTの最新バージョンを使っていく際には,注意して実行していく必要がありそうだ.