我正在使用以下课程轻松存储我的歌曲数据.
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似乎被认为是一种不良做法并且使用起来不安全.如果是这样,任何人都可以向我解释为什么并告诉我一个更好的方法来定义上面的类?
我正在开发纯Python的网页游戏,并希望有一些简单的脚本可用于更多动态的游戏内容.特权用户可以实时添加游戏内容.
如果脚本语言可以是Python,那就太好了.但是,由于恶意用户可能会造成严重破坏,因此无法在访问游戏运行环境的情况下运行.是否可以在纯Python中运行沙盒Python?
更新:事实上,由于真正的Python支持会有点过分,因此使用Pythonic语法的简单脚本语言将是完美的.
如果没有任何Pythonic脚本解释器,是否有任何其他开源脚本解释器用纯Python编写,我可以使用?要求是对变量,基本条件和函数调用(不是定义)的支持.
我想将一个数学运算符和要比较的数值传递给一个函数.这是我破碎的代码:
def get_truth(inp,relate,cut):
if inp print(relate) cut:
return True
else:
return False
Run Code Online (Sandbox Code Playgroud)
并称之为
get_truth(1.0,'>',0.0)
Run Code Online (Sandbox Code Playgroud)
哪个应该返回True.
我正在尝试使用eval()执行许多函数,我需要为它们创建一些运行环境.在文档中可以说你可以将全局变量作为第二个参数传递给eval().
但似乎在我的情况下不起作用.这是简单的例子(我尝试了两种方法,声明变量global和使用globals(),两者都不起作用):
import test
global test_variable
test_variable = 'test_value'
g = globals()
g['test_variable'] = 'test_value'
eval('test.my_func()', g)
Run Code Online (Sandbox Code Playgroud)
def my_func():
global test_variable
print repr(test_variable)
Run Code Online (Sandbox Code Playgroud)
我得到了:
NameError:未定义全局名称"test_variable".
我应该怎么做才能将其传递test_variable给my_func()?假设我无法将其作为参数传递.
我有这段代码.
def maths(operator):
#different math here..
final = final + number #i want to use the operator arg here
Run Code Online (Sandbox Code Playgroud)
.后来,我想把它称为数学('+')或数学(' - '),所以我不必每次都使用相同的代码.
例如,假设我有一堆这样的赋值语句:
if operator == '==':
if a == b:
c += 5
elif operator == '>':
if a > b:
c += 5
elif operator == '<':
if a < b:
c += 5
Run Code Online (Sandbox Code Playgroud)
我给出的if嵌套if语句和赋值只是例子,但在我写的程序中,它们真的很长.只是在操作员不同的地方出现了一个小小的变化,所以我不想在所有这些条件下一遍又一遍地重复相同的长代码.有太多的条件,代码将重复多次..那么有一个"更快"的方法来做到这一点?我可以将字符串定义为运算符吗?还是更好的方法?
实现这一目标的最佳方法是什么:
user_input = ">"
if 2 user_input 3:
print("yes")
Run Code Online (Sandbox Code Playgroud)
我想避免写另一个if声明:
if user_input == ">":
if 2 > 3:
print("yes")
Run Code Online (Sandbox Code Playgroud) 我真的很困惑,我不知道如何解决以下问题.
想象一下,我编写了一个很长的代码,我想将这个长代码转换为一个函数来防止重复.问题是我需要将'添加符号'(+)和'减法符号'( - )作为函数输入.我的意思是我有一个非常长的代码,我需要每次更改两个加法和减法的符号,而不是更多,最后根据改变这两个运算符得到输出(这两个运算符实际上是我的变量!)
如您所知,对于改变"加法和减法符号"的四种不同状态重复这个长函数,会使我的代码更长更长.我想知道是否有任何方法可以定义一个函数,它将这对加法和减法运算符作为输入,并给出这四种不同条件的输出?我举了一个简单的例子来澄清这个问题:
想象一下,我在"减号"和"加号"中有四个相似的"for循环":
edges=set()
a=60; b=40
for i in range(0,300):
a+=1; b+=1
if a!=0 and b!=0:
edges.add((a, b))
a=60; b=40
for i in range(0,300):
a-=1; b-=1
if a>=0 and b>=0:
edges.add((a, b))
a=60; b=40
for i in range(0,300):
a+=1; b-=1
if a>=0 and b>=0:
edges.add((a, b))
a=60; b=40
for i in range(0,300):
a-=1; b+=1
if a>=0 and b>=0:
edges.add((a, b))
print(edges)
Run Code Online (Sandbox Code Playgroud)
如你所见,除了"加号和减号"之外,这四个"for循环"都是相同的.我想只写一个函数而不是这四个重复的'for循环'.有没有其他方法可以解决这个问题?任何人有任何想法?
python ×8
eval ×2
function ×2
arguments ×1
operators ×1
performance ×1
python-2.7 ×1
repeat ×1
scripting ×1