我想知道是否可以确定是否在Python中传递了具有默认值的函数参数.例如,dict.pop是如何工作的?
>>> {}.pop('test')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'pop(): dictionary is empty'
>>> {}.pop('test',None)
>>> {}.pop('test',3)
3
>>> {}.pop('test',NotImplemented)
NotImplemented
Run Code Online (Sandbox Code Playgroud)
pop方法如何确定第一次没有传递默认返回值?这是否只能在C中完成?
谢谢
我是否初始化整数变量是否有任何区别:
int i = 0;
int i;
Run Code Online (Sandbox Code Playgroud)
编译器或CLR是否将此视为同一事物?IIRC,我认为他们都被视为同一件事,但我似乎无法找到这篇文章.
在了解了在R中使用稀疏矩阵的选项之后,我想使用Matrix包从以下数据框创建稀疏矩阵,并使所有其他元素都是NA.
s r d
1 1089 3772 1
2 1109 190 1
3 1109 2460 1
4 1109 3071 2
5 1109 3618 1
6 1109 38 7
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用以下内容创建一个稀疏矩阵,像往常一样访问元素:
> library(Matrix)
> Y <- sparseMatrix(s,r,x=d)
> Y[1089,3772]
[1] 1
> Y[1,1]
[1] 0
Run Code Online (Sandbox Code Playgroud)
但如果我想将默认值设为NA,我尝试了以下内容:
M <- Matrix(NA,max(s),max(r),sparse=TRUE)
for (i in 1:nrow(X))
M[s[i],r[i]] <- d[i]
Run Code Online (Sandbox Code Playgroud)
并得到了这个错误
Error in checkSlotAssignment(object, name, value) :
assignment of an object of class "numeric" is not valid for …Run Code Online (Sandbox Code Playgroud) 我有一个构造函数声明:
MyConstuctor(int inDenominator, int inNumerator);
Run Code Online (Sandbox Code Playgroud)
和定义为
MyConstuctor::MyConstuctor(int inDenominator,
int inNumerator, int inWholeNumber = 0)
{
mNum = inNumerator;
mDen = inDenominator;
mWhole = inWholeNumber;
}
Run Code Online (Sandbox Code Playgroud)
但我希望有一个选项可以将整数作为第三个参数传递,具体取决于调用者对象.这是正确的方法.如果不是什么可以替代方式.
我想用一个例子可以更好地解释这一点
我有以下案例类
case class Person(name: String = "no name", surname: String = "no surname")
Run Code Online (Sandbox Code Playgroud)
我想制作一个通用函数来填充它,例如,json消息,可能没有指定所有字段
我知道要使用默认值,简单的答案不是将它们传递给构造函数,但如果我有几个字段可能会或可能不会出现在json中,我应该使用一个巨大的切换句子覆盖每个可能的组合缺少参数.在这种情况下,读完json之后,我应该照顾姓名和姓氏,没有姓名,没有姓,也没有名字和姓氏......(哎呀,我希望自己明白了).
更确切地说,我正在尝试开发一个函数,允许我从followgin json值创建一个人,当缺少某些参数时使用默认值
{ "name": "john", "surname": "doe" }
{ "surname": "doe" }
{ "name": "john" }
{ }
Run Code Online (Sandbox Code Playgroud)
这就是为什么我正在寻找一种更通用的方法来处理这个问题.
(我将展示一些伪代码,以便了解我想要实现的目标)
我在考虑这样的事情:
val p = Person(name= "new person name", surname= Unit)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,姓氏应该获得默认值
或类似的东西
val p = Person( Map( "name" -> "new person name" ) _* )
Run Code Online (Sandbox Code Playgroud)
因此它也采用了surname的默认值
或者也许在构造函数中执行它,如果我检测到空值(或None),我可以分配默认值.
实际上,我试图避免重复默认值的定义.
无论如何,实现这样的事情最常用的方式是什么?
(GNU)make使用了几个变量,如:
CC - 默认情况下为C编译器 ccCFLAGS - C编译器的标志,默认为空我想在我的中指定一些我自己的默认值Makefile.在下面的示例中,我使用条件赋值运算符?=在运行时能够覆盖我的默认值make:
CFLAGS ?= CFLAGS_my_default
CC ?= CC_my_default
print:
echo CC=$(CC) CFLAGS=$(CFLAGS)
Run Code Online (Sandbox Code Playgroud)
不幸的是,这不会改变CC变量的值,因为原始默认值保持不变.CFLAGS由我的赋值设置,因为变量最初是空的:
$ make print
echo CC=cc CFLAGS=CFLAGS_my_default
CC=cc CFLAGS=CFLAGS_my_default
Run Code Online (Sandbox Code Playgroud)
从环境变量覆盖按预期工作:
$ CC=CC_from_env CFLAGS=CFLAGS_from_env make print
echo CC=CC_from_env CFLAGS=CFLAGS_from_env
CC=CC_from_env CFLAGS=CFLAGS_from_env
Run Code Online (Sandbox Code Playgroud)
如何更改变量的默认值,并且仍然可以在调用时覆盖它们make?
我刚刚在这里和这里询问了有关数组和值初始化的两个问题.但是使用这段代码,我迷路了:
#include <iostream>
#include <iomanip>
#include <array>
template <class T, class U = decltype(std::declval<T>().at(0))>
inline U f1(const unsigned int i)
{T x; return x.at(i);}
template <class T, class U = decltype(std::declval<T>().at(0))>
inline U f2(const unsigned int i)
{T x = T(); return x.at(i);}
int main()
{
static const unsigned int n = 10;
static const unsigned int w = 20;
for (unsigned int i = 0; i < n; ++i) {
std::cout<<std::setw(w)<<i;
std::cout<<std::setw(w)<<f1<std::array<int, n>>(i);
std::cout<<std::setw(w)<<f2<std::array<int, n>>(i); …Run Code Online (Sandbox Code Playgroud) 我想澄清MySQL 5.5和5.6中默认值的行为.可以说我们在MySQL 5.5服务器上有下表:
CREATE TABLE `test` (
`TestColumn` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=INNODB DEFAULT CHARSET=utf8;
Run Code Online (Sandbox Code Playgroud)
我可以毫无问题地运行以下查询:
INSERT INTO `test` VALUES (NULL);
Run Code Online (Sandbox Code Playgroud)
这会创建以下行:
TestColumn
2014-02-20 14:55:05
Run Code Online (Sandbox Code Playgroud)
现在如果我在MySQL 5.6服务器上重复相同的测试,插入失败:
Error Code: 1048
Column 'TestColumn' cannot be null
Run Code Online (Sandbox Code Playgroud)
我知道时间戳自动初始化在5.6(http://dev.mysql.com/doc/refman/5.6/en/timestamp-initialization.html)中有所改变,但我无法解决的是如何复制行为见5.6中的5.5.
不确定它是否重要但我们的5.6服务器将explicit_defaults_for_timestamp设置为ON.
理想情况下,我所追求的是解决方案,但如果有人有更好的理解,并且可以解释它也是有用的.
谢谢.
编辑:我们正在使用MySQL 5.6.13
假设我有这样的代码:
void f(int a = 0, int b = 0, int c = 0)
{
//...Some Code...
}
Run Code Online (Sandbox Code Playgroud)
正如您可以在上面看到我的代码,参数a,b以及c默认参数值为0.现在看看我的主要功能如下:
int main()
{
//Here are 4 ways of calling the above function:
int a = 2;
int b = 3;
int c = -1;
f(a, b, c);
f(a, b);
f(a);
f();
//note the above parameters could be changed for the other variables
//as well.
}
Run Code Online (Sandbox Code Playgroud)
现在我知道我不能只跳过一个参数,并让它具有默认值,因为该值将作为该位置的参数进行评估.我的意思是,我不能,比如说f(a,c),因为,c将被评估为b,这是我不想要的,特别是如果c是错误的类型.有没有一种方法让调用函数在C++中指定,在任何给定的位置使用函数的任何默认参数值,而不限于从最后一个参数向后转到无?是否有任何保留关键字来实现这一目标,或者至少是解决方法?我可以给出一个例子:
f(a, …Run Code Online (Sandbox Code Playgroud) 我想创建以下类:
class MyClass<T = {}> {
constructor(private values: () => Promise<T> = () => Promise.resolve({})) {}
}
Run Code Online (Sandbox Code Playgroud)
当然,编译器会抱怨,因为类型T未知,因此无法为其分配空对象:
Type '() => Promise<{}>' is not assignable to type '() => Promise<T>'.
Run Code Online (Sandbox Code Playgroud)
但是我觉得每次创建一个MyClass具有默认T值的新对象时都给构造函数赋予默认方法是相当“脏”的。
你认为最好的写法是什么?