如果我通过许多不同的文件/脚本使用此结构 如果需要进行更改,我怎样才能在一个地方进行更改,而不必在每个文件中进行更改。
u = contents
incomingUrl = urlparse(u).query
ok = parse_qsl(urlparse(u).query, keep_blank_values=True)
def eventType(ok):
try:
return o[0][1]
except (IndexError):
pass
def networkName(ok):
try:
return ok[1][1]
except (IndexError):
pass
def networkEmail(ok):
try:
return ok[2][1]
except (IndexError):
pass
def channelName(ok):
try:
return ok[3][1]
except (IndexError):
pass
def sceneType(ok):
try:
return ok[4][1]
except (IndexError):
pass
def sceneUrl(ok):
try:
return ok[5][1]
except (IndexError):
pass
def sceneTag1(ok):
try:
return ok[6][1]
except (IndexError):
pass
def sceneTag3(ok):
try:
return ok[7][1]
except (IndexError):
pass
def scenePrice(ok):
try:
return ok[8][1]
except (IndexError):
pass
def scenePriceDnom(ok):
try:
return ok[9][1]
except (IndexError):
pass
def networkAvatar(ok):
try:
return ok[10][1]
except (IndexError):
pass `
def sceneLat(ok):
try:
return ok[11][1]
except (IndexError):
pass
def sceneLong(ok):
try:
return ok[12][1]
except (IndexError):
pass
def timestamp(ok):
try:
return ok[13][1]
except (IndexError):
pass
我如何客观化我猜这个结构,将它改变一个地方并把它带到很多地方。 我一直在使用类和方法....这只是一个类,但我怎么把它带到另一个文件中并使用它?有点困惑这个。
来自来源的示例数据
http://webservice.com/log?eventType=youtubeScene&networkName=loqootv&networkEmail=sirthomas@gmail.com&sendToChannel=loqootv&sceneType=youtubeScene&
sceneUrl=https://webservice.s3.amazonaws.com/tv_702ef50873f7270323b7285c28aae078837b7ecb.mp4&sceneTag1=youtube_gdata_player&
sceneTag3=&sceneTip=&sceneTipDnom=&networkAvatar=BTC×tamp=http://www.gravatar.com/avatar/59e9efab5fcf64b3d391641f5?&d=http%3A%2F%2Fwebservice.com%2Floqootv%2FLTVlogo.png&size=2048
答案 0 :(得分:3)
为了分解冗余代码,我会写一个装饰器:
results = {} # This dict can map your API
def indexcatcher(func):
def inner(*args, **kwargs):
try:
results[func.__name__] = result = func(*args, **kwargs)
return result
except IndexError:
pass
return inner
然后为每个功能:
@indexcatcher
def eventType(ok):
return ok[0][1]
@indexcatcher
def networkName(ok):
return ok[1][1]
@indexcatcher
def networkEmail(ok):
return ok[2][1]
@indexcatcher
def channelName(ok):
return ok[3][1]
@indexcatcher
def sceneType(ok):
return ok[4][1]
@indexcatcher
def sceneUrl(ok):
return ok[5][1]
@indexcatcher
def sceneTag1(ok):
return ok[6][1]
@indexcatcher
def sceneTag3(ok):
return ok[7][1]
@indexcatcher
def scenePrice(ok):
return ok[8][1]
@indexcatcher
def scenePriceDnom(ok):
return ok[9][1]
@indexcatcher
def networkAvatar(ok):
return ok[10][1]
@indexcatcher
def sceneLat(ok):
return ok[11][1]
@indexcatcher
def sceneLong(ok):
return ok[12][1]
@indexcatcher
def timestamp(ok):
return ok[13][1]
在定义每个函数并使用装饰器包装它之后,该装饰器记录特定项的结果并处理可能的索引异常:
def get_results(ok):
eventType(ok)
networkName(ok)
networkEmail(ok)
channelName(ok)
sceneType(ok)
sceneUrl(ok)
sceneTag1(ok)
sceneTag3(ok)
scenePrice(ok)
scenePriceDnom(ok)
networkAvatar(ok)
sceneLat(ok)
sceneLong(ok)
timestamp(ok)
return results
现在你的结果dict应该为你提供一个映射,这应该与你当前的API向后兼容。
results = datamodule.get_results(ok)
现在你从70开始减少55行(其中约1/4是空白行)(如果有空行将它们分开,那么是什么,83)?新功能更具可读性,所以这也是一点维护收益。
现在,如果你要从每个文件中导入它,你必须保持一致的API,如果你做了很多,你需要真正考虑改变它的成本和好处。