2

必須のリスト要素 (不特定の数) で始まり、=.

  • element-separatorは要素の一部である必要が,あり、スペースは要素の一部になる必要があります-これは除外されるshlexと思います。
  • 先頭と末尾のスペースは削除する必要があります(引用符も)
  • 要素に が含まれる場合,、ユーザーは引用する必要があります"
    • また"key=value,with,comma"
    • またはkey="value,with,comma"-- 実装がより簡単なもの
  • 間違った引用符や引用文字を含む要素で未定義の動作が発生しても問題ありません。
  • 二重キーの動作も未定義です。
  • 実装が大幅に簡素化される場合は、これを少し変更しても問題ありません。

関数を呼び出して、 aと aをopts返すようにしましょう。listdict

以下に、いくつかの入力例と望ましい結果を示します。

opts('dog,cat')                 # -> ["dog", "cat"], {}
opts('big fish,cat')            # -> ["big fish", "cat"], {}
opts('"a dog, a cat",a fish')   # -> ["a dog, a cat", "a fish"], {}
opts('key=value')               # -> [] {'key':'value'}
opts('key=the value,x=y')       # -> [] {'key':'the value', 'x':'y'}
opts('dog, big fish, eats="any, but peas", flies = no! '
   # -> ['dog','big fish'], {'eats':'any, but peas', 'flies':'no!' }

shlexargparseoptparseおよび を無視configparserしました。これらをどう処理すればよいかわかりません。ただし、正規表現がこの問題を解決するかどうかはわかりません。json構文が少し厳しすぎると思います。evalそのまま、もう少し私の好みに合わせれば(Pythonを解析するため;-) )

私の手動ソリューションmacroはあまり柔軟ではなく、そのパラメーター処理をopts(s)上記のより一般的な関数に置き換えたいと考えています。

def macro(s):
    kw = { 'see':u"\\see", 'type':u"Chapter", 'title': u'??' }
    params = s.split(",")
    kw['label'] = params[0]
    if len(params) > 1:                   # very inflexible
        kw['title'] = params[1]
    for param in params[2:]:              # wrong if p[1] is already key=value
        key, value = param.split("=",1)  # doesn't handle anything, too simple
        kw[key] = value
    # ...rest of code...

目標は、再利用可能な関数optsをここで使用することです。

def macro_see(s):
    ls, kw = opts(s)
    # ...rest of code...
4

3 に答える 3