私のアプリケーションでは、文字列を受け取っています'abc[0]=123'
この文字列をアイテムの配列に変換したい。私はそれを試してみましたが、うまくいきeval()
ませんでした。配列名は知っていabc
ますが、アイテムの数は毎回異なります。
文字列を分割し、配列インデックスを取得して実行できます。しかし、この文字列を配列挿入として変換する直接的な方法があるかどうかを知りたいです。どんな提案でも大歓迎です。
次のようなものを探していますか
In [36]: s = "abc[0]=123"
In [37]: vars()[s[:3]] = []
In [38]: vars()[s[:3]].append(eval(s[s.find('=') + 1:]))
In [39]: abc
Out[39]: [123]
しかし、これは変数を作成する良い方法ではありません
これは、php ルールに従って URL を解析するための関数です (つまり、角括弧を使用して配列またはネストされた構造を作成します)。
import urlparse, re
def parse_qs_as_php(qs):
def sint(x):
try:
return int(x)
except ValueError:
return x
def nested(rest, base, val):
curr, rest = base, re.findall(r'\[(.*?)\]', rest)
while rest:
curr = curr.setdefault(
sint(rest.pop(0) or len(curr)),
{} if rest else val)
return base
def dtol(d):
if not hasattr(d, 'items'):
return d
if sorted(d) == range(len(d)):
return [d[x] for x in range(len(d))]
return {k:dtol(v) for k, v in d.items()}
r = {}
for key, val in urlparse.parse_qsl(qs):
id, rest = re.match(r'^(\w+)(.*)$', key).groups()
r[id] = nested(rest, r.get(id, {}), val) if rest else val
return dtol(r)
例:
qs = 'one=1&abc[0]=123&abc[1]=345&foo[bar][baz]=555'
print parse_qs_as_php(qs)
# {'abc': ['123', '345'], 'foo': {'bar': {'baz': '555'}}, 'one': '1'}
他のアプリケーションが間違っています。パラメータキーにインデックス値を指定しないでください。GET で 1 つのキーに複数の値を指定する正しい方法は、単純にキーを繰り返すことです。
http://my_url?abc=123&abc=456
Python サーバー側は、これを辞書のようなオブジェクトに正しく解決する必要があります。実行しているフレームワークはわかりませんが、たとえば、Django はQueryDictrequest.GET.getlist('abc')
を使用しており、これを使用してアクセスできます['123', '456']
。他のフレームワークも同様です。