Pythonic方法在不同的有限参数上重复方法调用

时间:2010-08-14 22:36:24

标签: python coding-style

我正盯着我制作的一段Python代码,虽然这是正确的,但却很丑陋。有更多的pythonic方式吗?

    r = self.get_pixel(x,y, RED)
    g = self.get_pixel(x,y, GREEN)
    b = self.get_pixel(x,y, BLUE)
    t = function(r,g,b)
    if t: 
        r2, g2, b2 = t  
        self.set_pixel(x,y,RED, r2)
        self.set_pixel(x,y,GREEN, g2)
        self.set_pixel(x,y,BLUE, b2)

问题是重复get_pixelset_pixel的方法调用。供您参考:

    RED, GREEN, BLUE = range(3)

另请注意,我希望保持代码清晰度和清晰度。

4 个答案:

答案 0 :(得分:5)

当您使用self时,get_pixel等似乎是您的类的方法。而不是列表推导和zip()以及其他解决方法,请查看API并修复它们。两个建议:

  1. 编写另一个返回3元组的方法get_pixel_colors(x, y)。然后你可以写r, g, b = self.get_pixel_colors(x, y)
  2. 同样:self.set_pixel_colors(x, y, r, g, b)
  3. 更好的是,您可以使用*args表示法:

    old_colors = self.get_pixel_colors(x, y)
    new_colors = function(*old_colors)
    if new_colors:
        self.set_pixel_colors(x, y, *new_colors)
    

答案 1 :(得分:4)

我会使用命名元组来表示颜色,并将类更改为使用颜色属性而不是单独的get_pixel(x,y,c)。 例如:

from collections import namedtuple
Color = namedtuple('Color', 'red green blue')
#...

color = self.get_pixel(x, y)
t = function(*color)
if t:
    self.set_pixel(x, y, color)

编辑:感谢John Machin在此处提出的更正建议。他的回答也让我更深入地了解了这种方法的原因。我想补充一点,namedtuple的优势在于我希望拥有color.redcolor.greencolor.blue这样的字段。 YMMV。

答案 2 :(得分:1)

要调用具有不同参数的函数并收集结果,您可以使用列表推导:

r1, r2, r3 = [foo(x) for x in [x1, x2, x3]]

要为其副作用调用一个函数,我建议不要使用列表推导而是使用普通的for循环:

ijs = [(i1, j1), (i2, j2), (i3, j3)]
for i, j in ijs:
    bar(i, j)

但是你的问题并不是你不应该单独为每种颜色调用你的设定像素。如果可能,请更改您的API,以便您可以按照 John Machin 的建议执行此操作:

old_colors = self.get_pixel_colors(x, y)
new_colors = function(*old_colors)
if new_colors:
    self.set_pixel_colors(x, y, *new_colors)

答案 3 :(得分:1)

colors = (RED, GREEN, BLUE)

r, g, b = [self.get_pixel(x, y, col) for col in colors]
t = function(r, g, b)
for col, rgb in zip(colors, t):
    self.set_pixel(x, y, col, rgb)