将多个引用应用于单个函数的最佳pythonic方法

时间:2018-08-22 20:23:04

标签: python function alias

我正在读取包含数千条记录(每行一条)的文本文件。每个字母以5个字符开头,第一个字母为字母,后跟4个数字,例如H0100。

定义了可用的起始标签列表,因此尽管最后一个数字值可以是1-9(有时最后两个可以是1-9),但不是随机的。

所以记录类别可以是以下H0100,H0101 ..... H0109中的任何一个

在某些情况下,倒数第二位的范围为100个组合。

我想创建一个函数来处理每个记录,这样,如果标识了标签中的前3个或第4个字符,则调用相同的函数。原因是记录的格式本质上是相同的,即使标签中的最后一个或两个值发生了变化,记录也可以相同地处理。

此刻我正在处理案例H0100,H0101 ..... H0109

  render() {
const goToConfirmationPage = this.state.goToConfirmation;
const goToThankYouPage = this.state.goToThankYou;

return (
  <div id="redeem-root">
    <Switch>
        <Route
          exact path={url.redeemHome()}
          render={() => (
            goToConfirmationPage ? (
              <Redirect to={url.confirm()} push />
            ) : (
              <EnterGiftCard
                loading={this.state.loading}
                selectedCardType={this.state.selectedCardType}
                giftCardStartRedemption={this.giftCardStartRedemption}
                isSmallView={this.state.isSmallView}
                error={this.state.error}
                setActiveCardType={this.setActiveCardType}
                setPin={this.setPin}
                pin={this.state.pin}
              />
            )
          )}
        />
        <Route
          exact path={url.confirm()}
          render={() => (
            goToThankYouPage ? (
              <Redirect to={url.thankYou()} push/>
            ) : (
              <ConfirmWithClickTracking
                loading={this.state.loading}
                resetConfirmState={this.resetConfirmState}
                pin={this.state.pin}
                selectedCardType={this.state.selectedCardType}
                entitlement={this.state.entitlement}
                giftCardConfirmRedemption={this.giftCardConfirmRedemption}
                error={this.state.error}
                trackingInfo={{ pageName: 'RedeemConfirm' }}
              />
            )
          )}
        />

        <Route
          exact
          path={url.thankYou()}
          render={() => (
            <ThankYouWithClickTracking
              selectedCardType={this.state.selectedCardType}
              userEmailAddress={this.state.userEmailAddress}
              entitlement={this.state.entitlement}
              resetState={this.resetState}
              trackingInfo={{ pageName: 'RedeemThankYou' }}
            />
          )}
        />
      </Switch>
  </div>
)

这可以工作,但是看起来不是很优雅,我相信它不是Pythonic!任何人都对我如何使它更简单/更优雅有任何建议?我有40-50个标签,其中一个字符更改,很少有两个字符更改,因此必须将100个替代方法指向一个功能。

非常感谢。

2 个答案:

答案 0 :(得分:2)

我个人的喜好是使用以相关前缀为键的函数字典。

def H0100(line)
      .....process line

funcs = { 'H010' : H0100,
          'H020' : H0200,
          ... etc...
        }

然后

for line in file:
    f = funcs[ line[:4] ]
    f(line) 

这是按前缀长度固定的方式工作的。可变长度前缀需要对该方法进行一些修改。您可以通过查看该行并确定它是三个字母的前缀标识符还是四个字母的标识符来实现相同的策略,然后针对该情况使用适当的查找表。如果没有更多细节,很难在这里提出具体的实现方案。

答案 1 :(得分:1)

您可以使用python内置的exec函数。

for i in range(101,110):
    print("H0%d = H0100" % i)   # Just so you see exactly what gets executed
    exec( "H0%d = H0100" % i)   # Perform each assignment

但是,我不认为您想创建一堆具有唯一名称的变量(这肯定是非python语言的,对于任何一种语言,通常都是不好的做法)。最好使用ListDictionary之类的数据结构。