小编Gab*_*ant的帖子

在函数内创建一个类并访问在包含函数范围内定义的函数

编辑:

请参阅本问题底部的完整答案.

tl;博士回答:Python有静态嵌套的范围.的静态 方面可以与隐变量声明相互作用,产生非显而易见的结果.

(这可能特别令人惊讶,因为语言通常具有动态性质).

我认为我对Python的范围规则有一个很好的处理,但是这个问题让我彻底陷入困境,而且我的google-fu让我失望了(不是我很惊讶 - 看看问题标题;)

我将从一些可以按预期工作的示例开始,但是可以自由地跳到示例4的多汁部分.

例1.

>>> x = 3
>>> class MyClass(object):
...     x = x
... 
>>> MyClass.x
3
Run Code Online (Sandbox Code Playgroud)

足够简单:在类定义期间,我们能够访问外部(在本例中为全局)范围中定义的变量.

例2.

>>> def mymethod(self):
...     return self.x
... 
>>> x = 3
>>> class MyClass(object):
...     x = x
...     mymethod = mymethod
...
>>> MyClass().mymethod()
3
Run Code Online (Sandbox Code Playgroud)

再次(忽略了为什么人们可能想要这样做),这里没有任何意外:我们可以访问外部范围中的函数.

注意:正如Frédéric在下面指出的那样,这个功能似乎不起作用.请参见示例5(及更高版本).

例3.

>>> def myfunc():
...     x = 3
...     class MyClass(object):
...         x = x
...     return MyClass
... …
Run Code Online (Sandbox Code Playgroud)

python scope namespaces

62
推荐指数
2
解决办法
5万
查看次数

Ember.js - 应该在哪里存储接口状态?

是否存在关于接口状态(与持久模型状态相对)应该存在于Ember.js应用程序中的官方故事?

路由器文档的"响应用户启动的事件"部分中,有一个将点击事件委托给照片的"showPhoto"方法的示例,但是模型"显示"本身似乎是一种不合需要的混合关注点.

我知道在许多情况下,状态应该存储在路由器中,以便接口状态在URL中表示,并在刷新页面或将URL发送给某人时恢复.但是非分层状态呢,例如页面上选择的项目列表呢?

理想情况下,该类型的状态将被序列化为查询/哈希参数(例如:http://www.hipmunk.com/flights/QSF-to-NYC#!dates=Sep15,Sep16p1;kind=flight&locations=QSF,YYZ&dates=Sep15 ,Sep23~tab = 1)但据我所知,路由器不提供该功能,是吗?

在BackboneConf,Jeremy Ashkenas说在Backbone中做到这一点的正确方法是将状态存储在模型上(他有一个带有"选定"字段的模型的例子).但是我相信汤姆戴尔说他认为这不是一个好主意,而不是在Ember应该怎么做.不幸的是,我不记得他提到应该怎么做.

javascript ember.js ember-old-router

7
推荐指数
1
解决办法
1023
查看次数

创建后的Ember数据编辑"错误:在状态root.loaded.updated.uncommitted中尝试在<app @ model:...>上处理事件`didCommit`

tl; dr:在模型保存正式不支持的情况下编辑模型的属性?我似乎记得,在大约2013年,国家机器拒绝了在记录处于飞行状态时进行编辑的尝试,但我认为该限制已被删除.它不再抛出状态机错误......它似乎只会导致错误:/


在我正在处理的应用程序中,按Enter键创建一个新条目并聚焦标题字段,让用户立即开始输入.对该字段的更改将通过去抖动保存自动保留.通常这很好用,但如果我开始输入太快,我会收到以下错误:

Attempted to handle event `didCommit` on <app@model: ...> while in state root.loaded.updated.uncommitted.
Run Code Online (Sandbox Code Playgroud)

(我在底部包含了完整的错误和追溯[1])

该记录看起来似乎已经正确地保存到服务器(Firebase通过EmberFire适配器),但是从那时起该应用程序还有其他奇怪之处(可能是因为运行循环的迭代在完成之前爆炸).

为了了解情况,我将观察者附加到模型currentState.stateNametitle字段上.对于无错误的创建和保存,记录将通过以下状态:

      [Press Enter; Pause]
               |
               V
 root.loaded.created.uncommitted
               |
               V
<title observer fires with blank>
               |
               V
   root.loaded.created.inFlight
               |
               V
       root.loaded.saved
               |
               V
        [Type in title]
               |
               V
root.loaded.updated.uncommitted
               |
               V
<title observer fires with value>
               |
               V
  root.loaded.updated.inFlight
               |
               V
       root.loaded.saved
Run Code Online (Sandbox Code Playgroud)

出现错误时,过程如下所示:

 [Press Enter & type immediately]
               |
               V
 root.loaded.created.uncommitted
               |
               V …
Run Code Online (Sandbox Code Playgroud)

race-condition ember.js ember-data emberfire

6
推荐指数
0
解决办法
447
查看次数

如何在双连接关系之后在Django中执行查询(或者:如何绕过Django对ManyToMany"模型"的限制?)

必须有办法通过ORM进行此查询,但我没有看到它.

安装程序

这就是我的建模:一个租户可以占用多个房间,一个用户可以拥有多个房间.所以房间有一个FK到租户和一个FK到用户.客房也由(可能不同的)用户维护.

也就是说,我有这些(简化)模型:

class Tenant(models.Model):
    name = models.CharField(max_length=100)

class Room(models.Model):
    owner = models.ForeignKey(User)
    maintainer = models.ForeignKey(User)
    tenant = models.ForeignKey(Tenant)
Run Code Online (Sandbox Code Playgroud)

问题

给定租户,我希望用户拥有他们占据的房间.

相关的SQL查询将是:

SELECT auth_user.id, ...
FROM tenants_tenant, tenants_room, auth_user
WHERE tenants_tenant.id = tenants_room.tenant_id
AND tenants_room.owner_id = auth_user.id;
Run Code Online (Sandbox Code Playgroud)

例如,可以使用相关用户对象获取任何单个值my_tenant.rooms.values_list('owner__email', flat=True),但获取用户的完整查询集会让我感到沮丧.

通常一个方式来解决这将是建立一个ManyToMany场在我Tenant的模型指向UserTenantRoom为"到"模型.这将不会在这种情况下工作,虽然,因为TenantRoom模型具有第二(无关)ForeignKeyUser(见"restictions").此外,它似乎是租户模型上的不必要的混乱.

做得my_tenant.rooms.values_list('user', flat=True)让我接近,但返回用户ID的ValuesListQuerySet而不是实际User对象的查询集.

问题

那么:有没有办法通过ORM只使用一个查询来获取实际模型实例的查询集?


编辑

事实上,如果通过ORM在一个查询中没有办法直接执行此操作,那么最好的(大多数高性能,最惯用,最可读等的组合)方法能够实现我正在寻找的东西吗?以下是我看到的选项:

  1. 子选择

    users = User.objects.filter(id__in=my_tenant.rooms.values_list('user'))
    
    Run Code Online (Sandbox Code Playgroud)
  2. 通过Python进行子选择(有关此背后的推理,请参阅性能注意事项)

    user_ids = id__in=my_tenant.rooms.values_list('user')
    users = User.objects.filter(id__in=list(user_ids)) …
    Run Code Online (Sandbox Code Playgroud)

python django django-models django-orm django-queryset

5
推荐指数
1
解决办法
805
查看次数

如何在Ember.js集成测试中按下修改键来模拟键事件?

我正在尝试测试对shift+ deletekey组合作出反应的事件处理程序,但Test.keyEvent方法的Ember文档似乎没有提及激活修饰键的任何方法.

我试图发出一个keydownshift(键代码16),然后keydowndelete(键代码46):

keyEvent('.my input', 'keydown', 16);  // Shift
keyEvent('.my input', 'keydown', 46);  // Delete
keyEvent('.my input', 'keyup', 46);  // Delete
keyEvent('.my input', 'keyup', 16);  // Shift
Run Code Online (Sandbox Code Playgroud)

但删除事件的shiftKey属性仍未定义

testing ember.js

4
推荐指数
1
解决办法
1285
查看次数