小编dhk*_*hke的帖子

谁叫了元类

这实际上源于对SO的讨论.

精简版

def meta(name, bases, class_dict)
    return type(name, bases, class_dict)

class Klass(object):
    __metaclass__ = meta
Run Code Online (Sandbox Code Playgroud)

meta()Klass执行类声明时调用.

(python内部)代码的哪一部分实际调用了meta()

长版

声明类时,某些代码必须进行适当的属性检查,并查看类型是否有__metaclass__声明.如果存在,则必须使用众所周知的(class_name, bases, class_dict)属性对该元类执行方法调用.我不清楚哪个代码负责该调用.

我已经在CPython中进行了一些挖掘(见下文),但我真的希望能有更接近确定答案的东西.

选项1:直接调用

元类调用被硬连线到类解析中.如果是的话,有没有证据证明这一点?

选项2:它被称为 type.__new__()

type_call()拨打电话type_new()中的代码_PyType_CalculateMetaclass().这表明type()在尝试找出要返回的值时,在调用期间实际完成了元类分辨率type()

这与"类"是" 可返回对象的可调用 "的概念一致.

选项3:不同的东西

当然,我所有猜测都可能是完全错误的.

我们在聊天中提出的一些示例案例:

例1:

class Meta(type):
    pass

class A:
    __metaclass__ = Meta

A.__class__ == Meta
Run Code Online (Sandbox Code Playgroud)

这就是Meta.__new__()回报,所以这似乎是合法的.元类使自己成为A.__class__

例2:

class Meta(type):
    def __new__(cls, class_name, bases, class_dict):
        return type(class_name, bases, class_dict)

class A(object): …
Run Code Online (Sandbox Code Playgroud)

python metaclass python-2.7

11
推荐指数
1
解决办法
201
查看次数

我们如何将 Python 上下文管理器与其块中出现的变量“关联”?

据我了解,Python 中使用上下文管理器来定义对象的初始化和完成代码段 (__enter__和)。__exit__

然而,在PyMC3 教程中,他们展示了以下上下文管理器示例:

basic_model = pm.Model()

with basic_model:

    # Priors for unknown model parameters
    alpha = pm.Normal('alpha', mu=0, sd=10)
    beta = pm.Normal('beta', mu=0, sd=10, shape=2)
    sigma = pm.HalfNormal('sigma', sd=1)

    # Expected value of outcome
    mu = alpha + beta[0]*X1 + beta[1]*X2

    # Likelihood (sampling distribution) of observations
    Y_obs = pm.Normal('Y_obs', mu=mu, sd=sigma, observed=Y)
Run Code Online (Sandbox Code Playgroud)

并提到这的目的是将变量alphabetasigmamuY_obs模型 basic_model 相关联。

我想了解这样的机制是如何运作的。在我发现的上下文管理器解释 中,我没有看到任何建议上下文块中定义的变量或对象如何以某种方式“关联”到上下文管理器。库(PyMC3)似乎可以以某种方式访问​​“当前”上下文管理器,因此它可以在幕后将每个新创建的语句与其关联。但是库如何访问上下文管理器呢?

python contextmanager pymc3

11
推荐指数
1
解决办法
3393
查看次数

low_memory和memory_map标志在pd.read_csv中做了什​​么

函数签名pandas.read_csv包括以下选项:

read_csv(filepath_or_buffer, low_memory=True, memory_map=False, iterator=False, chunksize=None, ...)
Run Code Online (Sandbox Code Playgroud)

我找不到任何文件low_memorymemory_map标志.我对这些功能是否已实现感到困惑,如果是这样,它们如何工作.

特别,

  1. memory_map:如果实现它是否使用np.memmap,如果是,它将各个列存储为memmap或行.
  2. low_memory:它是否指定了cache存储在内存中的内容?
  3. 我们可以将现有转换DataFramememmapped DataFrame

PS:相关模块的版本

pandas==0.14.0
scipy==0.14.0
numpy==1.8.1
Run Code Online (Sandbox Code Playgroud)

python python-2.7 pandas

10
推荐指数
1
解决办法
4156
查看次数

滚动后如何使列表元素获得DragEvents

精简版:

  • 有没有办法让新创建的视图接收DragEvent已经运行的拖放操作?

还有如何注册的dragEvent,而里面已经之一,有它在当前的dragEvent听?,但我真的很喜欢更清洁的解决方案.

为了获得"正确",建议的GONE-> VISIBLE变通方法非常复杂,因为您需要确保仅在列表项可见时使用它而不是无条件地在所有当前列表视图项上使用它.在这种情况下,hack略有泄漏,没有更多的解决方法代码来实现它.

长版:

我有一个ListView.ListView自定义View 的元素包含可拖动符号(小方框),例如类似于:

示例播出

可以将ListView诸如排序元素之类的项之间的小方框拖动到框中.列表项上的拖动处理程序或多或少是微不足道的:

@Override
public boolean onDragEvent(DragEvent event)
{
    if ((event.getLocalState() instanceof DragableSymbolView)) {
        final DragableSymbolView draggedView = (DragableSymbolView) event.getLocalState();
        if (draggedView.getTag() instanceof SymbolData) {
            final SymbolData symbol = (SymbolData) draggedView.getTag();
            switch (event.getAction()) {
            case DragEvent.ACTION_DRAG_STARTED:
                return true;

            case DragEvent.ACTION_DRAG_ENTERED:
                setSelected(true);
                return true;

            case DragEvent.ACTION_DRAG_ENDED:
            case DragEvent.ACTION_DRAG_EXITED:
                setSelected(false);
                return true;

            case DragEvent.ACTION_DROP:
                setSelected(false);
                // [...] remove symbol from soruce box and add to current …
Run Code Online (Sandbox Code Playgroud)

android scroll drag-and-drop android-listview

9
推荐指数
1
解决办法
819
查看次数

WordNet:遍历同义词集

对于一个项目,我想衡量文本中“以人为本”的单词的数量。我计划使用WordNet进行此操作。我从未使用过它,我也不知道如何完成此任务。我想使用WordNet来计算属于某些同义词集的词的数量,例如sysnets的“ human”和“ person”。

我提出了以下(简单)代码段:

word = 'girlfriend'
word_synsets = wn.synsets(word)[0]

hypernyms = word_synsets.hypernym_paths()[0]

for element in hypernyms:
    print element
Run Code Online (Sandbox Code Playgroud)

结果是:

Synset('entity.n.01')
Synset('physical_entity.n.01')
Synset('causal_agent.n.01')
Synset('person.n.01')
Synset('friend.n.01')
Synset('girlfriend.n.01')
Run Code Online (Sandbox Code Playgroud)

我的第一个问题是,如何正确迭代上位音?在上面的代码中,它们可以正常打印。但是,使用“ if”语句时,例如:

count_humancenteredness = 0
for element in hypernyms:
    if element == 'person':
        print 'found person hypernym'
        count_humancenteredness +=1
Run Code Online (Sandbox Code Playgroud)

我得到'AttributeError:'str'对象没有属性'_name'。当单词确实属于“人”或“人”同义词时,我可以使用什么方法来迭代单词的上位词并执行操作(例如,增加以人为中心的计数)。

其次,这是一种有效的方法吗?我假设遍历多个文本并遍历每个名​​词的上位字母将花费一些时间。也许还有另一种使用WordNet来更有效地执行任务的方法。

谢谢你的帮助!

python nltk wordnet

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

用漂亮的文字编写JSON文件

在以下代码中,我们将对象和JSON类型的数组写入文本文件:

/**
 * @param args the command line arguments
 */
public static void main(String[] args) throws IOException {


    JSONObject obj = new JSONObject();
    obj.put("Name", "crunchify.com");
    obj.put("Author", "App Shah");

    JSONArray company = new JSONArray();
    company.add("Compnay: eBay");
    company.add("Compnay: Paypal");
    company.add("Compnay: Google");
    obj.put("Company List", company);

    // try-with-resources statement based on post comment below :)
    try (FileWriter file = new FileWriter("file.txt")) {


                    Gson gson = new GsonBuilder().setPrettyPrinting().create();
                    JsonParser jp = new JsonParser();
                    JsonElement je = jp.parse(obj.toJSONString());
                    String prettyJsonString = gson.toJson(je);
                    System.out.println(prettyJsonString);                  

                    file.write(prettyJsonString);
        System.out.println("Successfully Copied …
Run Code Online (Sandbox Code Playgroud)

java json pretty-print gson

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

在 Python 中,我们应该在参数列表中设置 Optional[str] = None 吗?

我的同事说我最近写的代码崩溃了,那是因为在函数的参数列表中我没有指定Optional[str] = None. 我只有Optional[str].

所以基本上我的函数是这样的:

def a(b: Optional[str]):
    if b is None:
        <do something>
    else:
        <do something>
Run Code Online (Sandbox Code Playgroud)

我一直认为 Optional 参数的默认值是 None,所以我没有指定默认值。它没有为我崩溃,但为我的同事崩溃了,所以我有点困惑。

我的python版本是>=3。

python python-3.x

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

fill insert() - 复制构造函数和复制赋值noexcept状态?

  1. STL容器元素是否需要具有noexcept复制构造函数和复制赋值运算符?如果可能,请提供参考.
  2. 如果不是,当多插入期间发生异常时,例如在填充插入期间,STL容器的状态是什么.

尝试编写允许拦截/否决修改的通用包装时会出现问题.我能提出的任何实现都可能会改变底层容器的语义,除非专门针对每个容器类型(这不是一个真正的选项).

例如,std::vector有一个填充插入:

void insert (iterator position, size_type n, const value_type& val);
Run Code Online (Sandbox Code Playgroud)

这需要value_type同时是CopyInsertableCopyAssignable.需要注意的是它并没有要求值类型为缺省构造.

编辑3 Stroustrup本人(第956页的表)表明多元素插入应该对所有向量,双端队列,列表和映射具有强大的保证.这意味着完整的标准库操作要么原子成功要么失败.

编辑4但是,保证仅适用于相关操作(在本例中为复制构造函数)本身不会抛出异常,这正是我的问题.

据我了解,这留下了两个基本的实现方法:

  1. 为新元素和复制分配创建虚拟条目val.这只有在可以通过复制容器中的现有元素或者何时value_typeDefaultConstructible(这不是必需的)创建虚拟元素时才有效.
  2. 复制构造元素一个接一个地直接进入容器中它们各自的位置.这似乎或多或少是规范的实现.

编辑2:我不会调用这种未定义的行为,因为该术语似乎会使人们认为未定义为语言运行时/标准.

当复制构造函数或复制赋值运算符引发异常时,这两种实现似乎都会使容器具有未知内容(即,在异常之后不清楚容器占用哪些元素).

编辑1:请注意,这并不意味着我认为C++运行时存在不良行为,例如内存泄漏或未定义的值.但是,似乎或多或少未指明容器的内容是什么.特别是,容器的内容可能已完全(尽管一直)改变.

例如,考虑第三种(混合)方法:

  1. 创建n模板对象的副本列表val.
  2. 将此列表中的元素复制分配到目标容器中.

不同之处在于复制构造函数引发异常时对容器的影响.在这种情况下,如果复制构造函数抛出(但在复制赋值运算符抛出时仍会导致未指定的内容),则容器的内容保持不变.当使用指针(即不使用时std::vector)时,可能会遗漏复制分配,只重新排列指针,使操作原子化.例外.

至于noexcept容器元素:对象是通过创建的 …

c++ stl insert copy-constructor copy-assignment

3
推荐指数
1
解决办法
155
查看次数

Eclipse无法确定主类

到目前为止我的代码是:

package graphics;

import acm.graphics.*;
import acm.program.*;

public class project1 {
    public class graphics extends GraphicsProgram {
        private static final long serialVersionUID = 1L;
        public void run() {
            add( new GLabel( "hello, world", 100, 75));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我收到错误:

线程"main"中的异常acm.util.ErrorException:无法确定主类.at acm.program.Program.main(Program.java:1358)

我已经通过在线参考获得了这一点,除了我在运行配置中在我自己的帐户上做的两个修改,acm.program.Program在主选项卡中设置为主类,并且还设置code=acm.program.Program为程序参数,不确定这是否相关或不.

java acm-java-libraries

2
推荐指数
1
解决办法
424
查看次数

在Django urlpatterns中省略'url(')有什么意义

我已经获得了一些Django代码来接管settings.py中urlpatterns中的一些条目使用url(),而有些则不能在这里看到:

urlpatterns = patterns('',
    (r'^grappelli/', include('grappelli.urls')), 
    url(r'^admin/', include(admin.site.urls)),
    (r'^movies/', include('movies.urls')),
    (r'^profile/', include('userprofile.urls')),
    (r'^api/', include(v1_api.urls)),
    url(r'^$', TemplateView.as_view(template_name='base.html'), name='home'),
    url(r'^trailer/', TemplateView.as_view(template_name='trailer.html'), name='trailer'),
    url(r'^newuser/', TemplateView.as_view(template_name='trailer.html'), name='activate'), 
    url(r'^abcd123/', TemplateView.as_view(template_name='trailer.html'), name='url_login'), 
    url(r'^fb/', TemplateView.as_view(template_name='fb.html'), name='fb'), 
)
Run Code Online (Sandbox Code Playgroud)

是否使用会有什么不同url(吗?有推荐的标准吗?

python django

2
推荐指数
1
解决办法
86
查看次数

Django 自定义反序列化

我有以下 Django 模型:

class Person(models.Model):
    name = models.CharField()
    location = models.PointField()
Run Code Online (Sandbox Code Playgroud)

我想为此模型创建一个序列化器/反序列化器。但是我收到的 JSON 对象如下:

{
   "userList":[
      {
         "username": "Foo",
         "lat":40.875736,
         "lon":8.94382834,
      },
      {
      "username": "Bar",
      "lat":40.875736,
      "lon":8.94382834,
      }, 
   ]
}
Run Code Online (Sandbox Code Playgroud)

串行器

class PersonListSerializer(serializers.PersonSerializer):
    username = serializers.CharField()
    lat = serializers.FloatField()
    lon = serializers.FloatField()


class PersonSerializer(serializers.ModelSerializer):
    personList = PersonListSerializer

    class Meta:
        model = Person
Run Code Online (Sandbox Code Playgroud)

是否可以创建自定义序列化器/反序列化器来处理此结构,而无需创建额外的模型(PersonList)?

提前致谢。

python django json django-rest-framework

2
推荐指数
1
解决办法
1700
查看次数

如何使用C语言在目录中找到所有具有相同扩展名的文件?

如何使用C语言在目录中找到所有具有相同扩展名的文件?我的意思是我只想作为参数输入扩展名然后我想列出所有输入扩展名的文件

int main (int argc,char *argv[]) 
{
    DIR *dir;
    struct dirent *dent;

    if (argc != 3) {
        printf("usage: ./Exe_Name dir_name file_name");    
    }
    dir = opendir(argv[1]);
    //this part 
    if(dir!=NULL) { 
        while((dent=readdir(dir))!=NULL)
           if(strcmp(dent->d_name,argv[2])==0)
               printf("%s\n",dent->d_name);

    } else
        printf ("Cannot open directory '%s'\n", argv[1]);
    closedir(dir);
    return 0; 
}
Run Code Online (Sandbox Code Playgroud)

c

-2
推荐指数
1
解决办法
67
查看次数