gpt4 book ai didi

python - 操作来自namedtuple()派生类的属性

转载 作者:太空宇宙 更新时间:2023-11-03 17:40:31 25 4
gpt4 key购买 nike

我有一个名为 EasyUrl() 的类(class)源自 urlparse.Parseresult()ParseResult()调用 urlparse.urlparse(url) 时实例化,我里面有一个静态方法 EasyUrl()更改实例化 ParseResult() 的类类型对象变成 EasyUrl()目的。我包裹urlparse.urlparse()函数和类类型转换为函数 parse_url() .

这样一个函数背后的原因是我试图解决一个单独的问题,我不需要答案但想要一个,是我得到一个 TypeError__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

最佳答案

为什么不从头开始创建一个新类并将 ParseResult 中的所有属性转移过来?

import urlparse

class EasyURL(object):
def __init__(self, parse_result):
self.scheme = parse_result.scheme
self.netloc = parse_result.netloc
self.path = parse_result.path
self.params = parse_result.params
self.query = parse_result.query
self.fragment = parse_result.fragment

@classmethod
def from_url(cls, url):
return cls(urlparse.urlparse(url))

if __name__ == '__main__':
url = 'http://foo.bar.com:8888/path/to/script.php?a=1&b=2'

# Call from_url class method, which is very convenient
easy_url = EasyURL.from_url(url)

# Or, do it yourself
easy_url = EasyURL(urlparse.urlparse(url))

您现在可以根据需要向此类添加任何其他方法。

更新

  • namedtuple 是一个动态创建新类型的函数。顺便说一句,除非我们为 __getitem__() 添加一些代码,否则我们的 EasyURL 对象不会充当元组。
  • ParseResult 不允许您更改 scheme 等属性,因此没有理由继承它。

关于python - 操作来自namedtuple()派生类的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30634243/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com