小编Nat*_*han的帖子

避免大量if ... else语句的Python方式?

最近,它已经出现了好几次,我想比以前更好地处理它:我有一系列要在对象和字典之间进行交叉引用的属性。如果它们之间的值不同,我想将object.attribute设置为dictionary ['attribute']值。我还想跟踪正在发生的变化。

现在,我的第一个想法是仅对每个属性使用if else语句,但是在编写了其中一些语句之后,很明显,我一次又一次地重写了相同的代码。必须有一种DRY方法来执行此操作,在该方法中,我仅指定每次更改的部分,然后遍历所有属性。

在生产代码中,有15个不同的属性,但是为了简单起见,我在下面的示例中仅使用2个属性。我对如何巧妙地执行此操作有一些想法,但是我没有真正设置object.attribute等于Dictionary ['attribute']值的最后一步。

# Simulated data setup - not under my control IRL
class someClass:
    def __init__(self, name, version):
        self.name = name
        self.version = version

objA = someClass('Test1','1.1')        
dictA = {'name':'Test1','revision':'1.2'}

# My code below        

# option 1 - a series of for loops
def updateAttributesSimple(obj, adict, msg):
    if obj.name == adict['name']:
        msg.append('Name is the same')
    else:
        msg.append('Name was updated from %s to %s' % (obj.name, adict['name']))
        obj.name = adict['name']

    if obj.version == adict['revision']:
        msg.append('Version is the …
Run Code Online (Sandbox Code Playgroud)

python

5
推荐指数
1
解决办法
3716
查看次数

Python:将所有函数包装在库中

我们使用另一个内部团队提供的库.(现在开始摇摇欲坠的比喻)

from externalTeam import dataCreator
datacreator.createPizza()
datacreator.createBurger()
datacreator.createHotDog()
Run Code Online (Sandbox Code Playgroud)

最近我们发现他们的一种方法在某些情况下需要花费一分钟才能完成.为了调试这个,我不得不进入我们的代码并在每次调用此方法时添加超时.

import time
from externalTeam import dataCreator
start = time.clock()
datacreator.createPizza()
stop = time.clock()
print "It took %s seconds to perform createPizza" % (str(stop-start))
Run Code Online (Sandbox Code Playgroud)

事后来看,那是因为我们在整个地方都在调用createPizza,而且我们并不控制createPizza本身(这里的类比开始分解).我宁愿在一个地方调用createPizza,并且可以在其周围添加一个计时器.我首先想到的是在我自己的包装器类中创建一个包装所有方法.这是干的对面,虽然,他们随时添加其他方法我不得不更新我们的库来包装,以及:

import time
from externalTeam import dataCreator
def createPizza(self):
    start = time.clock()
    datacreator.createPizza()
    stop = time.clock()
    print "It took %s seconds to perform createPizza" % (str(stop-start))

def createBurger(self):
    start = time.clock()
    datacreator.createPizza()
    stop = time.clock()
    print "It took %s seconds to perform createBurger" % (str(stop-start))

def createHotDog(self):
    start …
Run Code Online (Sandbox Code Playgroud)

python wrapper

5
推荐指数
3
解决办法
3647
查看次数

Terraform-在IDE中自动填充所需的属性

我最近与杰出的Yevgeniy Brikman一起上课,在他创建Terraform资源时,他的IDE自动填充了必需的属性。例如,如果他键入:

resource "aws_lambda_function" "lambda_example" {
Run Code Online (Sandbox Code Playgroud)

他的IDE将自动填充:

resource "aws_lambda_function" "lambda_example" {
  function_name = ""
  handler       = ""
  runtime       = ""
  role          = ""
}
Run Code Online (Sandbox Code Playgroud)

现在,我经常编写Terraform代码,该功能将很方便,但是我找不到配置我的IDE的方法(Visual Studio Code)。我准备切换IDE-如何获得此功能?

ide terraform visual-studio-code

2
推荐指数
1
解决办法
1106
查看次数

AWS CLI 在错误区域执行

我的 AWS 配置文件配置为默认为 eu-west-1,但是当我运行 AWS CLI 命令时,它在 us-east-1 中执行:

>aws configure get region
eu-west-1

>aws events put-rule --name hourly_trigger --schedule-expression "rate(60 minutes)"
{ 
  "RuleArn": "arn:aws:events:us-east-1:588237033746:rule/hourly_trigger"
}
Run Code Online (Sandbox Code Playgroud)

我查看了配置文件和配置选项,但无法确定这是为什么。我的个人资料设置如下:

[default]
region = eu-west-1
Run Code Online (Sandbox Code Playgroud)

如果我添加 --region,则该命令可以在预期区域中工作

>aws events put-rule --name hourly_trigger --schedule-expression "rate(60 mi
nutes)" --region eu-west-1
{
    "RuleArn": "arn:aws:events:eu-west-1:588237033746:rule/hourly_trigger"
}
Run Code Online (Sandbox Code Playgroud)

amazon-web-services aws-cli aws-regions

1
推荐指数
1
解决办法
2746
查看次数