我正在使用pythons whois
模块检查.by
区域中的可用域。该模块当前不支持它。但是我要做的就是将这些代码添加到... / lib / python3.8 / site-packages / whois / tld_regexpr.py:
by = {
'extend': 'com'
}
我认为将代码硬编码到lib文件夹中是不正确的。我的代码现在看起来像这样:
import whois
def free_domains(domain_list):
"""Looking for free domains"""
free_d = []
for domain in domain_list:
if whois.query(domain) is None:
free_d.append(domain)
return free_d
但是没有这些注射就无法工作。 🤔如何从我的.py文件扩展tld_regexpr.py?
供参考,这里是whois.tld_regexpr
的源代码。像这样在whois.tld_regexpr
中使用它:
whois._2_parse
我们可以看到,这运行一些模块级代码,这些代码从whois._2_parse
中的数据生成正则表达式并将其缓存在from . import tld_regexpr
TLD_RE = {}
def get_tld_re(tld):
if tld in TLD_RE:
return TLD_RE[tld]
v = getattr(tld_regexpr, tld)
extend = v.get('extend')
if extend:
e = get_tld_re(extend)
tmp = e.copy()
tmp.update(v)
else:
tmp = v
if 'extend' in tmp:
del tmp['extend']
TLD_RE[tld] = dict((k, re.compile(v, re.IGNORECASE) if isinstance(v, str) else v) for k, v in tmp.items())
return TLD_RE[tld]
[get_tld_re(tld) for tld in dir(tld_regexpr) if tld[0] != '_']
全局表中。
令人讨厌的是,没有办法轻松扩展tld_regexpr
之前,因为此模块是从顶层TLD_RE
导入的。然后,内部代码此后甚至不再使用tld_regexpr
,即使它为缓存提供了接口:/因此,在添加新的TLD之后,您需要在新TLD上显式调用此__init__.py
。类似于:
get_tld_re
之前:
get_tld_re
之后:
from whois import tld_regexpr
from whois._2_parse import get_tld_re # a "private" module, but they leave us little choice
tld_regexpr.by = {
'extend': 'com'
}
get_tld_re('by')
我猜该模块的扩展性不是最佳设计,但是没关系-可以通过一些小的调整来解决。同时,您应该向作者提交PR,以添加更多ccTLD或使扩展性更容易。