将字符串参数传递给类/函数(Python)

3

If I have a class as such:

class Sample:
    def __init__(self, a, b, c):
        self.a = a
        self.b = b
        self.c = c

我可以通过以下方式创建一个对象:

temp = Sample(a=100,b=100,c=100)

但如果我遇到以下情况怎么办:

my_str = "a=100,b=100,c=100"

我该如何正确地执行temp = Sample(my_str)操作呢?

3
这似乎是一个 XY 问题。你从哪里获取那个字符串? - internet_user
你可能需要在另一个构造函数中解析它。 - Ankush Rathi
建议:将__init__更改为__init__(self, **kwds) - Nozar Safari
1
其中一些答案建议使用 eval。虽然它很简单,但是 有一些原因使得 eval 不被推荐使用。 - Mateen Ulhaq
eval是一个有用的工具,不应该避免使用!虽然它存在一些问题,但在需要时必须使用它。 - Nozar Safari
6个回答

4
你可以像这样解析和评估字符串:

代码:

@classmethod
def from_str(cls, a_str):
    return cls(**eval("dict({})".format(a_str)))

测试代码:

class Sample:
    def __init__(self, a, b, c):
        self.a = a
        self.b = b
        self.c = c

    @classmethod
    def from_str(cls, a_str):
        return cls(**eval("dict({})".format(a_str)))

x = Sample.from_str("a=100,b=100,c=100")
print(x.a)

结果:

100

那么使用ast.literal_eval怎么样?我猜将其格式化为字典也可以。 - pylang
@pylang ast.literal_eval 无法处理运算符(如 =)。ast.literal_eval('a=100') 会引发 SyntaxError: invalid syntax - G_M

1
使用 eval
temp = eval("Sample("+my_str+")")

1
尽管使用eval可能是一种选择,但是它可能很危险。这里有一个选项,即使用@StephenRauch的代码,只是不使用eval
>>> class Sample:
...     def __init__(self, a, b, c):
...         self.a = a
...         self.b = b
...         self.c = c
... 
...     @classmethod
...     def from_str(cls, a_str):
...         result = {}
...         for kv in a_str.split(','):
...             k, v = kv.split('=')
...             result[k] = int(v)
...         return cls(**result)
... 
>>> x = Sample.from_str('a=100,b=100,c=100')
>>> x.a
100
>>> type(x.a)
<class 'int'>

0
你可以使用以下代码。
class Sample:
    def __init__(self, a, b, c):
        self.a = int(a)
        self.b = int(b)
        self.c = int(c)

mystr = "a=100,b=100,c=100"
temp = Sample(mystr.split(",")[0].split("=")[1],mystr.split(",")[1].split("=")[1],mystr.split(",")[2].split("=")[1])
print(temp.a)
print(temp.b)
print(temp.c)

在这里查看它的运行情况


1
我不理解为什么我的回答会被负投票。 - CodeIt
我也是,你的和下面的应该一样吧 - 我会给你点赞的伙计 - Ankush Rathi
@AnkushRathi 谢谢。 - CodeIt

0

这对我有用:

my_str = "a=100,b=100,c=100"                                                                                         

temp = Sample(int(my_str.split(',')[0].split('=')[1]),
               int(my_str.split(',')[1].split('=')[1]),
               int(my_str.split(',')[2].split('=')[1]))

print(temp.a)
# prints 100

print(temp.b)
# prints 100

print(temp.c)
# prints 100

temp.a == 100 而不是 temp.a == 'a=100',对吗? - G_M
但是它不应该是一个整数吗?你返回的是'100'而不是100 - G_M
@DeliriousLettuce 感谢您的评论,我又进行了编辑 :) 现在看起来怎么样? - Vikram Hosakote

0

你可以简单地输入 temp = Sample(100,100,100) 类会自动解释

a = 100
b = 100
c= 100

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接