EasyUrl()
から派生したというクラスがありurlparse.Parseresult()
ます。ParseResult()
を呼び出すときにインスタンス化されます。インスタンス化されたオブジェクトのクラス型をオブジェクトに変更urlparse.urlparse(url)
する静的メソッドが内部にあります。関数とクラスの型変換を関数にラップします。EasyUrl()
ParseResult()
EasyUrl()
urlparse.urlparse()
parse_url()
このような関数の背後にある理由は、別の問題を回避しようとする試みです。答えは必要ありませんが、答えが欲しいのですが、インスタンス化プロセス中にTypeError
when__new__
が呼び出され、無効な番号があることがわかります。引数の。
EasyUrl()
直接インスタンス化するときにエラーを受け取りました
# snippet
url = 'stackoverflow.com'
url = EasyUrl(url)
# snippet end
Output:
TypeError: __new__() takes exactly 7 arguments (2 given)
クラスはParseResult()
から継承しnamedtuple()
ます。
urlparse ライブラリからの抜粋
class ParseResult(namedtuple('ParseResult', 'scheme netloc path params query fragment'), ResultMixin):
__slots__ = ()
def geturl(self):
return urlunparse(self)
コードの機能について少し説明しましたが、ここで問題が発生します。名前付きタプルの (ParseResult) 属性にアクセスできません。ParseResult()
欠落している場合のデフォルトのスキームを実装しようとしています。
しかし、クラス定義の属性にアクセスできません。
import urlparse
def parse_url(url):
""" Return a parsed EasyUrl() object"""
parse_result = urlparse.urlparse(url)
return EasyUrl.EvolveParseResult(parse_result)
class EasyUrl(urlparse.ParseResult):
@staticmethod
def EvolveParseResult(parse_result):
""" Change the type of class into a EasyUrl() Object."""
parse_result.__class__ = EasyUrl
easy_url = parse_result # For readabilty
easy_url.init()
return easy_url
def __init__(self, url):
self = parse_url(url) # doesn't work
def init(self):
self.url = self.geturl()
#self.set_scheme_if_non() # Uncomment when no error is raised
def set_scheme_if_non(self, scheme='http'):
if not self.scheme:
self.scheme = scheme
self.url = self.geturl() # Rebuild our url with the new scheme
# Passes the set_scheme_if_non trigger
#url = 'https://stackoverflow.com'
# Fails if statment, then attempts to set the variable,
# but error is raised: AttributeError: can't set attribute
url = 'stackoverflow.com'
# Will give the error: TypeError: __new__() takes exactly 7 arguments (2 given)
#url = EasyUrl(url)
# works fine, I don't know why. Except that I can't access
# the tuples attributes in the class definition
url = parse_url(url)
print url.scheme # Works fine
url.set_scheme_if_non() # Raises an error
出力
File "/home/crispycret/easyurl.py", line 50, in <module>
url.set_scheme_if_non() # Raises an error
File "/home/crispycret/easyurl.py", line 29, in set_scheme_if_non
self.scheme = scheme
AttributeError: can't set attribute