我正在使用以下课程轻松存储我的歌曲数据.
class Song:
"""The class to store the details of each song"""
attsToStore=('Name', 'Artist', 'Album', 'Genre', 'Location')
def __init__(self):
for att in self.attsToStore:
exec 'self.%s=None'%(att.lower()) in locals()
def setDetail(self, key, val):
if key in self.attsToStore:
exec 'self.%s=val'%(key.lower()) in locals()
Run Code Online (Sandbox Code Playgroud)
我觉得这比写出一个if/else块更具可扩展性.但是,eval似乎被认为是一种不良做法并且使用起来不安全.如果是这样,任何人都可以向我解释为什么并告诉我一个更好的方法来定义上面的类?
我有一些字符串形式的代码,并希望在不写入磁盘的情况下创建一个模块.
当我尝试使用imp和StringIO对象来执行此操作时,我得到:
>>> imp.load_source('my_module', '', StringIO('print "hello world"'))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: load_source() argument 3 must be file, not instance
>>> imp.load_module('my_module', StringIO('print "hello world"'), '', ('', '', 0))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: load_module arg#2 should be a file or None
Run Code Online (Sandbox Code Playgroud)
如何在没有实际文件的情况下创建模块?或者,如何在不写入磁盘的情况下将StringIO包装在文件中?
更新:
注意:此问题在python3中也是一个问题.
我试图加载的代码只是部分信任.我已经完成了它,并确定它不会导入任何东西或做任何我不喜欢的事情,但我不相信它足以运行它,当我有可能被修改的局部变量,并且我不相信我自己的代码,以避免我试图导入的代码.
我创建了一个只包含以下内容的空模块:
def load(code):
# Delete all local variables
globals()['code'] = code
del locals()['code']
# Run the code
exec(globals()['code'])
# …Run Code Online (Sandbox Code Playgroud) 我想分配:
x0='123'
x1='123'
x2='123'
x3='123'
x4='123'
x5='123'
x6='123'
x7='123'
x8='123'
x9='123'
Run Code Online (Sandbox Code Playgroud)
我编写代码来表示我可以123在输入时获取字符串的输出x1或x8.
for i in range(0,10):
eval("x"+str(i)+"='123'")
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
File "<string>", line 1
x0='123'
^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)
我怎么能这样做?
我一直试图找到一种方法来可靠地设置和获取变量的值与字符串中的名称.我可以远程接近这一点找到的任何东西似乎都不起作用.变量可以在任何模块中,并导入这些模块.
获取和设置变量值的安全/正确方法是什么?
ps - 我和他们来到python一样新手
我想用eval定义一个Python函数:
func_obj = eval('def foo(a, b): return a + b')
Run Code Online (Sandbox Code Playgroud)
但它返回无效的语法错误?我该怎么做?
顺便问一下,如何在Python中将函数obj转换为字符串对象?
在创建它之后,我想读一个我创建为字符串的lambda函数.
例如,
func = lambda num1,num2: num1 + num2
Run Code Online (Sandbox Code Playgroud)
我想把func读作:
'lambda num1,num2: num1 + num2'
Run Code Online (Sandbox Code Playgroud)
有没有办法完成这个甚至读取lambda函数的任何部分?
如您所见,ifinner 是一个字符串,所以如果我只写在 if 之后,总是为真。我能做什么,将它与源代码协调一致?
x=2
ifinner = "x==3"
if ifinner:
print("Yeah")
else:
print("It works!")
Run Code Online (Sandbox Code Playgroud) 如何在python中将'a = b = 2'字符串转换为a = 2,b = 2?
有一些python解析器为2 + 3 + 4等表达式提供输出.
但是如何将'a = b = 2'字符串用作变量a = 2 b = 2
好吧,我们说我有一个字符串 s = '5 + 7'
是否有可能得到这个字符串的结果?(应该是12)
我试过用,int(s)但会出错
如果我在 python 文件中有一个包含一些代码的字符串。我想在字符串中运行代码,例如:
program = "for i in range(100):\n\tprint(i)"
eval(program)
Run Code Online (Sandbox Code Playgroud)
但是,我很确定 eval 仅适用于数学运算,因此会引发语法错误:
Traceback (most recent call last):
File "main.py", line 2, in <module>
eval(program)
File "<string>", line 1
for i in range(100):
^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)
python中有没有办法运行包含在字符串中的代码?
如果我的 Python 代码中有一个如下所示的 srting:
x = "print('Hello World')"
Run Code Online (Sandbox Code Playgroud)
我想像执行一个单独的 .py 文件一样执行它。有没有类似的东西
execute(x)
Run Code Online (Sandbox Code Playgroud)