0

私のアプリケーションでは、文字列を受け取っています'abc[0]=123'

この文字列をアイテムの配列に変換したい。私はそれを試してみましたが、うまくいきeval()ませんでした。配列名は知っていabcますが、アイテムの数は毎回異なります。

文字列を分割し、配列インデックスを取得して実行できます。しかし、この文字列を配列挿入として変換する直接的な方法があるかどうかを知りたいです。どんな提案でも大歓迎です。

4

3 に答える 3

1

次のようなものを探していますか

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]

しかし、これは変数を作成する良い方法ではありません

于 2013-01-21T11:00:13.777 に答える
1

これは、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'}
于 2013-01-21T11:30:37.317 に答える
0

他のアプリケーションが間違っています。パラメータキーにインデックス値を指定しないでください。GET で 1 つのキーに複数の値を指定する正しい方法は、単純にキーを繰り返すことです。

http://my_url?abc=123&abc=456

Python サーバー側は、これを辞書のようなオブジェクトに正しく解決する必要があります。実行しているフレームワークはわかりませんが、たとえば、Django はQueryDictrequest.GET.getlist('abc')を使用しており、これを使用してアクセスできます['123', '456']。他のフレームワークも同様です。

于 2013-01-21T11:14:00.027 に答える