我作为第一个参数" object"传递给函数setattr(object, name, value),在当前模块上设置变量?
例如:
setattr(object, "SOME_CONSTANT", 42);
Run Code Online (Sandbox Code Playgroud)
产生同样的效果:
SOME_CONSTANT = 42
Run Code Online (Sandbox Code Playgroud)
在包含这些行的模块中(正确object).
我在模块级别动态生成多个值,而我无法__getattr__在模块级别定义,这是我的后备.
我正在使用以下课程轻松存储我的歌曲数据.
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中很常见,应该有一个共同的习惯用法.但我不确定如何动态地这样做.
我有一个使用eval的例子,但这几乎不安全.我想知道这样做的正确方法 - 也许是lambda?
class Foo:
def setAllManually(self, a=None, b=None, c=None):
if a!=None:
self.a = a
if b!=None:
self.b = b
if c!=None:
self.c = c
def setAllWithEval(self, **kwargs):
for key in **kwargs:
if kwargs[param] != None
eval("self." + key + "=" + kwargs[param])
Run Code Online (Sandbox Code Playgroud) 我有 10 个参数需要初始化。按照约定,它们被命名为 a_true、b_true 等。它们不是列表或数组,而是独立变量。它们需要从长度为 1X10 的数组进行初始化。
我打算做这样的事情,我知道它有其缺点:
param=[34,65,...,234] # Contains initialization values
var=['a','b','c','d','e','f','g','h','i','j']
gvalues=[] # Array intended to contain variable names
k=0
for i in var:
gvalues.append(var[k]+'_true')
k+=1
Run Code Online (Sandbox Code Playgroud)
这会创建一个元素数组,如 a_true、b_true 等。我想将它们作为变量而不是数组的元素,最后使用 param 中的值初始化它们。有什么可能性吗?如果这看起来微不足道,新手很抱歉。
预期输出:
[a_true, b_true, ..., j_true]=[34, 65, ... , 234]
Run Code Online (Sandbox Code Playgroud) 我想创建多个名称与列之一中的值相同的数据框。我希望这段代码像这样工作:
import pandas as pd
data=pd.read_csv('athlete_events.csv')
Sports = data.Sport.unique()
for S in Sports:
name=str(S)
name=data.loc[data['Sport']==S]
Run Code Online (Sandbox Code Playgroud) 我需要通过一个小型游戏的另一个变量来命名一个变量。我为所有子弹做了一堂课,为敌人做了另外一堂课。
class bruh(object):
def __init__(self,x):
print(x)
for x in range(1,11):
x = bruh(x)
Run Code Online (Sandbox Code Playgroud)
我想要代码执行的操作是创建10个变量,每个变量的标签为1-10,每个变量都是bruh()对象,因此它们在创建时会打印x。不知道我是否愚蠢,但是有什么方法可以实现这一目标或类似目标吗?