我发现访问dict密钥更加方便,obj.foo
而不是obj['foo']
,所以我写了这个代码片段:
class AttributeDict(dict):
def __getattr__(self, attr):
return self[attr]
def __setattr__(self, attr, value):
self[attr] = value
Run Code Online (Sandbox Code Playgroud)
但是,我认为必须有一些原因,Python不提供开箱即用的功能.以这种方式访问dict密钥有什么警告和陷阱?
说明以下内容是正确的:
如果在C函数中创建了Python对象,但该函数没有返回它,INCREF
则不需要,但是a DECREF
.
[false]如果函数确实返回了它,你需要INCREF
在接收返回值的函数中.[/ false]
当分配了C类型的变量作为属性,如double
,int
等等,给Python对象,没有INCREF
或DECREF
需要.
将Python对象作为属性分配给其他Python对象,如下所示:
PyObject *foo;
foo = bar // A Python object
tmp = self->foo;
Py_INCREF(foo);
self->foo = foo;
Py_XDECREF(tmp);
//taken from the manual, but it is unclear if this works in every situation
Run Code Online (Sandbox Code Playgroud)编辑: - >我可以在任何情况下安全地使用它吗?(没有碰到一个导致我问题的地方)
DECREF
用于其作为属性的每个其他Python对象,但不适用于C类型的属性.编辑
'C type as a attribute'是指bar和baz:
typedef struct {
PyObject_HEAD
PyObject *foo;
int bar;
double baz;
} FooBarBaz;
Run Code Online (Sandbox Code Playgroud) 我有这个C程序,至少我认为它是(文件:spa.c,spa.h).有没有什么方法可以从Python执行这个脚本而不将额外的参数传递给Python解释器(如果没有,参数会是什么?)
更新:感谢您的回复.源代码可以在http://www.nrel.gov/midc/spa/#register找到
(请不要被网址中的'注册'吓到,如果你填写表格,你可以立即下载文件(没有验证邮件等)我会尝试你的建议并报告结果.
更新2:我使用gcc编译了源代码,但现在它在尝试调用()时给了我一个权限,即使以root身份运行python(im在Ubuntu 10:10上).
更新3 [Errno 8] Exec格式错误
更新4好的,我搞定了.程序使用printf输出值:
>>> call(['/path'])
Julian Day: 2452930.312847
L: 2.401826e+01 degrees
B: -1.011219e-04 degrees
R: 0.996542 AU
H: 11.105902 degrees
Delta Psi: -3.998404e-03 degrees
Delta Epsilon: 1.666568e-03 degrees
Epsilon: 23.440465 degrees
Zenith: 50.111622 degrees
Azimuth: 194.340241 degrees
Incidence: 25.187000 degrees
Sunrise: 06:12:43 Local Time
Sunset: 17:20:19 Local Time
Run Code Online (Sandbox Code Playgroud)
谢谢大家!
用例如
class model(models.Model)
....
def my_custom_method(self, *args, **kwargs):
#do something
Run Code Online (Sandbox Code Playgroud)
当我尝试在pre_save,save,post_save等过程中调用此方法时,Python引发了一个TypeError; 未绑定的方法.
如何添加自定义模型方法,可以像model.objects.get()等一样执行?
编辑:尝试使用super(model, self).my_custom_method(*args, **kwargs)
但在这种情况下Python说该模型没有属性my_custom_method
是否有可能:
for k,v in kwargs.items()
if v == None or v == '' or v == 1.0 or v == False:
del kwargs[k]
Run Code Online (Sandbox Code Playgroud)
如果v == 0.0,不删除密钥?(假似乎等于0.0),并且没有删除等于True的键.
考虑这个(django)模型:
class Source(models.Model):
# Some other fields
type = models.ForeignKey('Type')
class Type(models.Model):
# Some other fields
parent = models.ForeignKey('self')
Run Code Online (Sandbox Code Playgroud)
此模型具有自身的外键,从而创建层次结构.
假设我们有以下层次结构:
Website
Blog
News
Social Network
Q&A
Forum
Radio
Government radio
Pirate radio
Commercial radio
Internet radio
Run Code Online (Sandbox Code Playgroud)
如何有效地查询,这样如果我选择Source
的Type
,我也找回Sources
其中有一个Type
是给定类型的孩子?
我试过遍历整棵树,但这显然不是很有效.
另一种选择是使用ManyToManyField并通过覆盖save()方法自动附加父类型.例如,如果选择"博客",则还会创建"网站"的记录.但这似乎对我来说太过分了.
我从数据库中获取行并希望填充多维字典.
php版本大致如下:
foreach($query as $rows):
$values[$rows->id][] = $rows->name;
endforeach;
return $values;
Run Code Online (Sandbox Code Playgroud)
我似乎无法找出以下问题:
什么是使用自动编号将字符串添加到字典的python方法,例如$ values []
如何使用变量填充Python字典; 例如,使用values [id] = name,不会添加键,而是覆盖现有键.
我完全不知道如何实现这一点,因为我是一个Python初学者(实际上是编程).
假设你必须使用Python和Django来代码.
OBJECT_CACHE = {}
def get_my_objects(key, *args, **kwargs):
try:
return OBJECT_CACHE[key]
except KeyError:
OBJECT_CACHE[key] = # code to get object
return OBJECT_CACHE[key]
Run Code Online (Sandbox Code Playgroud)
在运行相同代码库的多个项目的情况下,这将如何表现?将OBJECT_CACHE
是为每个项目唯一的,还是会与所有项目的对象混在一起?
您可以从Django模板标签中获取Javascript读取变量var spec = "{{ foo }}";
.
但是,如果foo需要是JSON对象.它变成这样:
var spec = "{"2": {"guid": 2, "contentBlocks": {"2_1": {"guid": "2_1", "type": "list"}}}}";
Run Code Online (Sandbox Code Playgroud)
前面和后面的引号使这个JavaScript语法无效,但是,如果我将它们遗漏,它也是一个无效的语法 var spec = {{ foo }};
解决这个问题的最佳方法是什么?要么foo
输出完整的<script></script>
块,要么让JavaScript从服务器请求此对象,而不是通过模板标记输出?......
python ×7
django ×4
dictionary ×2
c ×1
if-statement ×1
javascript ×1
key ×1
methods ×1
model ×1
python-c-api ×1
syntax ×1