2

URL とそのヘッダーのコンテナ クラス Resource があります。

class Resource(object):
    def __init__(self, url, headers):
        self.url = url
        self.content-length = headers['content-length']
        self.content-type = headers['content-type']

        # etc....

メソッドへのheaders引数は、 のメソッド__init__から返される dict を期待しています。これは、リソースの URL とヘッダーをパッケージ化するより読みやすい方法だと思いました。何度も入力すると、このような辞書キーからの変数の作成を自動化する方法があるかどうか疑問に思いました。これは可能ですか?getinfo()urllib2.urlopen()self.someheader = headers['someheader']

4

2 に答える 2

4

-Python 識別子にシンボルを含めることはできません! したがって、キーでそれを置き換えることができ_ます。
キーを小文字に変更すると、従来の変数名のようになり、非常に重要なことに、大文字/小文字の混乱がなくなります (通常、ヘッダーは大文字のキーで送信されるため)。

for k, v in headers.items():
    setattr(self, k.lower().replace('-', '_'), v)

Python 2 を使用している場合はiteritems、アイテムの新しいリストを作成せず、Python 3 がデフォルトで行うように、アイテムを反復処理できるため、ここではより適切です。

これらのキーを「プライベート」 dict (例: )に格納することをお勧めしますself._headers__getattr__次に、とを使用してプロセスをより詳細に制御できます__setattr__。たとえば、無効なキーを設定しようとしたときに例外を発生させることができます。

于 2012-04-06T11:05:01.460 に答える
1

次のようなクラスの使用を検討してください

class ADict(dict):
    def __getattr__(self, field):
        return self.get(field)

これにより、ヘッダーを単純にラップできます。これは、他の人が指摘したように、ダッシュを含む属性にアクセスすることはできませんが、getattrinstaed を使用してこれらの属性にアクセスできます。でラップされた次のヘッダーを検討してくださいADict

header = {'content-type': 'text/javascript', 'content-length': 30, 'accept': 'text/html'}
aheader = ADict(header)

accept などの属性にはおなじみのドット構文を使用してアクセスできますが、無効な識別子属性には次の方法でアクセスできます。getattr

>>>> aheader.accept
'text/html'
>>>> getattr(aheader, 'content-length')
30
于 2012-04-06T11:38:57.710 に答える