这实际上源于对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 中使用上下文管理器来定义对象的初始化和完成代码段 (__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)
并提到这的目的是将变量alpha、beta、sigma和mu与Y_obs模型 basic_model 相关联。
我想了解这样的机制是如何运作的。在我发现的上下文管理器的解释 中,我没有看到任何建议上下文块中定义的变量或对象如何以某种方式“关联”到上下文管理器。库(PyMC3)似乎可以以某种方式访问“当前”上下文管理器,因此它可以在幕后将每个新创建的语句与其关联。但是库如何访问上下文管理器呢?
函数签名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_memory或memory_map标志.我对这些功能是否已实现感到困惑,如果是这样,它们如何工作.
特别,
memory_map:如果实现它是否使用np.memmap,如果是,它将各个列存储为memmap或行.low_memory:它是否指定了cache存储在内存中的内容?DataFrame为memmapped DataFramePS:相关模块的版本
pandas==0.14.0
scipy==0.14.0
numpy==1.8.1
Run Code Online (Sandbox Code Playgroud) 精简版:
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) 对于一个项目,我想衡量文本中“以人为本”的单词的数量。我计划使用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来更有效地执行任务的方法。
谢谢你的帮助!
在以下代码中,我们将对象和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) 我的同事说我最近写的代码崩溃了,那是因为在函数的参数列表中我没有指定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。
noexcept复制构造函数和复制赋值运算符?如果可能,请提供参考.尝试编写允许拦截/否决修改的通用包装时会出现问题.我能提出的任何实现都可能会改变底层容器的语义,除非专门针对每个容器类型(这不是一个真正的选项).
例如,std::vector有一个填充插入:
void insert (iterator position, size_type n, const value_type& val);
Run Code Online (Sandbox Code Playgroud)
这需要value_type同时是CopyInsertable和CopyAssignable.需要注意的是它并没有要求值类型为缺省构造.
编辑3 Stroustrup本人(第956页的表)表明多元素插入应该对所有向量,双端队列,列表和映射具有强大的保证.这意味着完整的标准库操作要么原子成功要么失败.
编辑4但是,保证仅适用于相关操作(在本例中为复制构造函数)本身不会抛出异常,这正是我的问题.
据我了解,这留下了两个基本的实现方法:
val.这只有在可以通过复制容器中的现有元素或者何时value_type是DefaultConstructible(这不是必需的)创建虚拟元素时才有效.编辑2:我不会调用这种未定义的行为,因为该术语似乎会使人们认为未定义为语言运行时/标准.
当复制构造函数或复制赋值运算符引发异常时,这两种实现似乎都会使容器具有未知内容(即,在异常之后不清楚容器占用哪些元素).
编辑1:请注意,这并不意味着我认为C++运行时存在不良行为,例如内存泄漏或未定义的值.但是,似乎或多或少未指明容器的内容是什么.特别是,容器的内容可能已完全(尽管一直)改变.
例如,考虑第三种(混合)方法:
n模板对象的副本列表val.不同之处在于复制构造函数引发异常时对容器的影响.在这种情况下,如果复制构造函数抛出(但在复制赋值运算符抛出时仍会导致未指定的内容),则容器的内容保持不变.当使用指针(即不使用时std::vector)时,可能会遗漏复制分配,只重新排列指针,使操作原子化.例外.
至于noexcept容器元素:对象是通过创建的 …
到目前为止我的代码是:
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为程序参数,不确定这是否相关或不.
我已经获得了一些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(吗?有推荐的标准吗?
我有以下 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)?
提前致谢。
如何使用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)