0

object.attribute を記述する Python 文字列が与えられた場合、属性の名前空間を属性から分離するにはどうすればよいですか?

望ましい例:

ns_attr_split("obj.attr") => ("obj", "attr")
ns_attr_split("obj.arr[0]") => ("obj", "arr[0]")
ns_attr_split("obj.dict['key']") => ("obj", "dict['key']")
ns_attr_split("mod.obj.attr") => ("mod.obj", "attr")
ns_attr_split("obj.dict['key.word']") => ("obj", "dict['key.word']")

注: 独自の文字列パーサーを作成することも 1 つの選択肢であることは理解していますが、これに対するより洗練された解決策を探しています。独自の文字列パーサーをロールすることは、「.」の rsplit ほど単純ではありません。特定のキーワードに名前空間区切り文字が含まれる可能性がある上記の最後のオプションのためです。

4

3 に答える 3

1

私は最近、Python ソース コードをトークン化するためのトークン化ライブラリを発見しました。このライブラリを使用して、この小さなコード スニペットを思いつきました。

import tokenize
import StringIO

def ns_attr_split(s):
  arr = []
  last_delim = -1
  cnt = 0

  # Tokenize the expression, tracking the last namespace
  # delimiter index in last_delim
  str_io = StringIO.StringIO(s)
  for i in tokenize.generate_tokens(str_io.readline):
    arr.append(i[1])
    if i[1] == '.':
      last_delim = cnt
    cnt = cnt + 1

  # Join the namespace parts into a string
  ns = ""
  for i in range(0,last_delim):
    ns = ns + arr[i]

  # Join the attr parts into a string
  attr = ""
  for i in range(last_delim + 1, len(arr)):
    attr = attr + arr[i]

  return (ns, attr)

これは、中間インデックス/キーでも機能するはずです。(つまり、「mod.ns[3].obj.dict['key']」)

于 2013-09-23T01:57:25.113 に答える
0

/[^a-zA-Z.]/名前空間が常に英数字であると仮定すると、最初に で分割し、次にrsplitで分割できます.

>>> import re
>>> ns_attr_split = lambda s: re.split("[^a-zA-Z.]", s, 1)[0].rsplit('.')
>>> ns_attr_split("obj.dict['key.word']") 
['obj', 'dict']

明らかに、これはまさにあなたが望むものではありません…しかし、いじるのは簡単です。

于 2013-09-23T01:00:08.180 に答える