4

私のプログラムでは、ユーザーが CouchDB データベースへの URL を指定できるようにしたいと考えています。

この URL の一部に適切なデフォルトを提供したいと考えています。たとえば、localhost、5984、および mushin は、それぞれホスト、ポート、およびパスのデフォルトです。

urlparse.urlparse は、プロパティ アクセサーを持ち、セッターを持たないタプル サブクラスを返します。

ホストとポート (および後でユーザー名とパスワード) は、タプルの netloc 部分を解析するプロパティです。ただし、これらのプロパティは取得のみです。したがって、私にとって理想的なこのコードは失敗します。

   try:
        jane = urlparse(args[0])
    except IndexError:
        self.stdout.write('Please give a database to replicate with.\n')
        return

    if not jane.hostname:
        jane.hostname = HOST
    if not jane.port:
        jane.port = PORT
    if not jane.path:
        jane.path = DB

    url = jane.geturl()

netloc はユーザー名/パスワード/ホスト/ポート コンポーネントに分割されていないため、タプル インターフェイスを使用しても役に立ちません。

URL を解析し、その一部をオーバーライドして、新しい URL に戻すより良い方法はありますか?

4

4 に答える 4

3

この問題を解決するために使用したフラグメント:

netloc_regex = re.compile(r"(?:([^:]+)(?::(.*))?@)?([^:]+)(?::([\d]+))?")
endpoint = # some value

scheme, netloc, path, params, query, fragment = urlparse(endpoint)
username, password, host, port = netloc_regex.search(netloc).groups()

# manipulate components here

auth = ":".join(filter(None, (username, password)))
address = ":".join(filter(None, (host, port)))
netloc = "@".join(filter(None, (auth, address)))
endpoint = urlunparse((scheme, netloc, path, params, query, fragment))

パスワードがNone. しかし、それは仕事を成し遂げます。

于 2013-05-01T18:26:48.970 に答える
1

yurlライブラリを使用して 1 行で実行できます。

>>> import yurl
>>> user_url = yurl.URL('http://without.port/#hash')
>>> your_defaults = yurl.URL('//:33/default')  # or URL(port=33, path='/default')

>>> print user_url.replace(*map(lambda x: x or None, your_defaults))
http://without.port:33/default#hash

map空の部分(空の文字列)を に置き換えて、メソッドNoneに引数として渡しますuser_url.replace()

于 2013-12-25T16:08:09.540 に答える
0

タプルの操作されたコピーに対してurlparse.urlunparseを使用します。

parts 引数は、任意の 6 項目 iterable にすることができます。

p = urlparse.urlparse(url)
l = list(p)
l[4] = "foo=bar" # manipulate query parameters
urlparse.urlunparse(l)
于 2012-09-11T11:12:31.777 に答える