2

Python の場合:

a = "l[0], l[1], l[2], l[3]"
# l[0] etc. have their own value

my_function(a) #doesn't work


#but this does work
my_function(l[0], l[1], l[2], l[3])

関数が変数を認識できるように、文字列を「変換」できますか? ありがとうございました。

その後の更新: 私の質問に答えてくれてありがとう。私はより大きな問題と、なぜ私が eval 関数に頼らなければならなかったのかを含めています(あなたの答えによれば、望ましくありません)。関数:

class Line(object):
def __init__(self, pt1, pt2, *pt):
    pt1 = Point(pt1[0],pt1[1])
    pt2 = Point(pt2[0],pt2[1])
    self.vertices = [pt1, pt2]
    for i in pt:
        self.vertices.append(Point(i[0],i[1]))

def __getitem__(self, key):
    pt = self.vertices[key]
    p = Point(p[0],p[1])
    return p

#Here is the part with the issue:

def move(self, dx, dy):
    pts = len(self.vertices)
    l = self.vertices

    pt1 = Point(Point(l[0].x, l[0].y).move(dx, dy).x, Point(l[0].x, l[0].y).move(dx, dy).y)
    pt2 = Point(Point(l[1].x, l[1].y).move(dx, dy).x, Point(l[1].x, l[1].y).move(dx, dy).y)
    if pts == 2:
        mv = LineString(p1, p2)
    if pts > 2:
        bla = ''
        for i in [2,pts]:
            px = Point(l[i].x, l[i].y).move(dx, dy).x
            py = Point(l[i].x, l[i].y).move(dx, dy).y
            l[i] = Point(px,py)
            bla += 'l[' + str(i) + '], '
            arguments = bla[:-2]
            mv = LineString(pt1, pt2, *eval(arguments))
    return mv

あなたの答えによると、これを解決するより良い方法があります..

4

3 に答える 3

3

XY問題が発生しました。
実際のXの問題は、任意の数のオブジェクトを関数に渡すことでした。
これらのオブジェクトの識別子を含む文字列を定義した後、この文字列からオブジェクトを抽出するYソリューションがあなたのグラールになりました。しかし、次のスニペットが実際のXの問題
に答えると確信しています。

    if pts > 2:
        blal = []
        for i in [2,pts]:
            px = Point(l[i].x, l[i].y).move(dx, dy).x
            py = Point(l[i].x, l[i].y).move(dx, dy).y
            blal.append(Point(px,py))
        mv = LineString(pt1, pt2, *blal)

これは、すべてのプログラミング言語に存在するわけではない、関数に任意の数の引数を渡すためにPythonによって提供される機能です。それを使わずに、自分の人生を複雑にするのは残念だろう。

新しいメンバーは、あまりにも早く賛成して答えを受け入れないように、通知されるか、あるいは防止されるべきだと思います。

編集

質問のコードブロックを次のコードブロックに置き換えることができると思います。

from itertools import chain

class Line(object):
    def __init__(self, pt1, pt2, *pt):
        self.vertices = map(lambda x: Point(*x),
                            chain((pt1,pt2), pt))

    def __getitem__(self, key):
        return Point(*self.vertices[key])

    def move(self, dx, dy):
        return LineString(*[ Point(Point(v.x, v.y).move(dx, dy).x,
                                   Point(v.x, v.y).move(dx, dy).y)
                             for v in self.vertices])   

                           

Soの要素の代わりにPoint()カップル(タプル、リスト...、私はあなたが何であるかわかりません)を受け入れるように定義することもできます。したがって、の代わりに書く ことができます。ptpt
Point(x)Point(*x)

self.vertices = map(Point, chain((pt1,pt2), pt))

それ以外の

self.vertices = map(lambda x: Point(*x),
                    chain((pt1,pt2), pt))

Point((v.x,v.y))しかし、代わりに 書く必要がありますPoint(v.x,v.y)

于 2013-03-04T00:08:36.643 に答える
3

これを行うevalには、文字列を評価する関数と*演算子を組み合わせてmy_function、結果のタプルに適用できます。

my_function(*eval(a))

ただし、正当な理由なしにこれを行うことは、ほとんどの場合、設計が悪いことを示しています。evalコードが実行時エラーやコード インジェクション攻撃に対して脆弱になり、重要なパフォーマンスの最適化が削除されます。実際の要件を説明すると、誰かがより良い解決策を提案できる可能性があります。

于 2013-03-03T09:51:31.233 に答える
2

Python メソッドは任意の引数リストを取ります。これが意味することは、関数は任意の数の引数を取ることができるということです。

次に例を示します。

def foo(*args, **kwargs):
   print args

foo('a','b','c','d')

ここで、引数として値を含むリストを渡したいとします。

mylist = ['a','b','c','d']
foo(mylist)

これにより、次のようになります。

(['a', 'b', 'c', 'd'],)

リストを最初の引数とするタプル。私たちが望むのは と同じ効果foo('a','b','c','d')です。それを取得するには、次のようにリストを展開する必要があります。

foo(*mylist)

これで同じ結果が得られます:

('a', 'b', 'c', 'd')

これを取得して問題に適用します。

def foo(*args, **kwargs):
   print "Total arguments: {}".format(len(args))

v = "a, b, c"
>>> foo(v)
Total arguments: 1
>>> foo(*v.split(','))
Total arguments: 3
于 2013-03-03T09:52:34.133 に答える