我仍然是Python的新手,我正在尝试习惯它的动态类型.有时我有一个函数或类需要某个类型的参数,但是可以得到另一个类型的值,它可以强制它.例如,它可能期望a float而是接收int或decimal.或者它可能需要一个字符串,而是接收一个定义__str__特殊方法的对象.
将论证强制转换为正确的类型(及其原因)的最佳做法是什么?我是在函数/类中还是在调用者中执行此操作?如果在调用者中,我是否也在函数中检查它?例如.
备选方案1:
def myfunc(takes_float):
myval = float(takes_float)
myfunc(5)
Run Code Online (Sandbox Code Playgroud)
备选方案2:
def myfunc(takes_float):
myval = takes_float
myfunc(float(5))
Run Code Online (Sandbox Code Playgroud)
备选方案3:
def myfunc(takes_float):
assert isinstance(takes_float, float)
myval = takes_float
myfunc(float(5))
Run Code Online (Sandbox Code Playgroud)
我已经读这个答案和这一次,他们说,在Python检查类型是"坏"的,但我不想把时间浪费在追踪非常简单的错误,这些错误会在静态类型被立即拾起编译器语言.
缺乏维护动态类型代码的经验,我正在寻找处理这种情况的最佳方法:
(python中的示例,但可以使用任何动态类型的语言)
def some_function(object_that_could_be_a_list):
if isinstance(object_that_could_be_a_list, list):
for element in object_that_could_be_a_list:
some_function(element)
else:
# Do stuff that expects the object to have certain properties
# a list would not have
Run Code Online (Sandbox Code Playgroud)
我对此感到非常不安,因为我认为一种方法应该只做一件事,而我认为它不像它应该的那样可读.所以,我很想做三个函数:第一个是"任何对象"和"排序"在另外两个之间,一个用于列表,另一个用于"简单"对象.然后,这会增加一些复杂性.
什么是最"可持续"的解决方案,以及保证易于维护的解决方案?对于那些我不知道的情况,python中有成语吗?提前致谢.
我有一个问题,我认为可能是直截了当但我似乎无法绕过它.
我有一个从一系列NSDictionaries加载的tableview.每个Dictionary都有一个标题(显示在行中)和一个关联的nssstring,表示一个viewcontroller,当选择该行时应该将其压入堆栈.换句话说,选择行"A"需要初始化"aViewController"的实例并将其推送到堆栈上,选择行"B"需要初始化"bViewController"的实例并将其推送到堆栈等.
我最初只是将所有可能的值硬编码到didSelectRow中.但我真的希望能够动态地动态生成viewController.我找到了几个类似问题的C++示例,这些示例使我得到了下面的代码.但我似乎无法做到正确,并且我不确定我是否正在寻找一个客观的解决方案.有人有什么想法?
这是didSelectRow代码不起作用:
Class cls = [selectedRow valueForKey:@"viewController"];
if (cls!= nil)
{
id myNewController = [[cls alloc] init];
}
[[self navigationController] pushViewController:myNewController animated:YES];
[myController release];
Run Code Online (Sandbox Code Playgroud) 以下是否正确?为什么?
x = 7;
y = 7.00;
z = x + y;
console.log(z);
Run Code Online (Sandbox Code Playgroud)
结果:
14
我希望日志结果为"14.00".
为什么C++中的内部类变量可以使用this,但不必,而内部PHP类属性必须使用$this->?
示例C++(可以使用this,但不必)
void setHealth(int h)
{
health = h;
}
Run Code Online (Sandbox Code Playgroud)
示例PHP(必须使用$this->)
public function setHealth($h)
{
$this->health = $h;
}
Run Code Online (Sandbox Code Playgroud)
$this->PHP中是否有任何优缺点?我可以看到,它毫无疑问地澄清了变量确实属于这个特定的类实例,而不是可能是本地范围的变量,但C++在没有这个要求的情况下管理得很好...
在编写仅使用整数运算的算法时,我注意到Python没有利用它.
所以我尝试了以下代码来查看"显式"声明效果
import time
repeat = 1000000
start = time.time()
x = 0
for i in range(repeat):
x += 1
no_type_time = time.time() - start
start = time.time()
y = int(0)
for i in range(repeat):
y += 1
int_time = time.time() - start
print('{} - No type'.format(no_type_time))
print('{} - Int'.format(int_time))
Run Code Online (Sandbox Code Playgroud)
代码输出如下:
0.0692429542542 - No type
0.0545210838318 - Int
Run Code Online (Sandbox Code Playgroud)
我认为它与Python是一种动态类型语言有关.但是当我试图找出变量的类型时,使用type(x)和type(y)都输出int.这很奇怪,因为我还使用x = float(0)运行了一些测试,结果非常接近没有类型"声明"的测试.
我想知道它为什么会发生,如果可能的话,可以从Python文档中获得一些解释它的参考.
[编辑]:这个问题与我无法控制的类型有关。因此,使它们无法继承超类或实现接口是不可能的。我希望能够做到这一点而无需包装类型。
我想编写一个方法,将包含特定方法的所有对象接受为参数。
例如,我们有2种完全不同的类型,它们都包含get具有相同签名的方法:
public class TypeOne {
public int get() { /* Some implementation */ }
}
public class TypeTwo {
public int get() { /* Some other implementation */ }
}
Run Code Online (Sandbox Code Playgroud)
如何编写可以接受这两种类型的方法?
public static int callGetOnObject(GettableObject gettableObject) {
return gettableObject.get();
}
Run Code Online (Sandbox Code Playgroud) 朋友们,我必须创建一系列ArrayLists,每个包含未知来源的对象,每个实例都分配给一个单独的局部变量.
到目前为止,这么好......但我还需要每个局部变量的名称遵循一个非常具体的模式:名称应以"oArr"开头,后跟一个或多个数字反映特定数组在序列中的位置.此外,我不会在编译时知道有多少这些数组 - 因此,我需要多少局部变量!
令我感到震惊的是,这可能是一个问题,可以通过C#4.0中动态类型的可用性来解决,但我对它们的使用并不熟悉.我怎么能拿这样的代码......
int i=0;
foreach(something)
{
ArrayList oArr+i=new ArrayList();
i++;
}
Run Code Online (Sandbox Code Playgroud)
...并将其转换为符合上述标准并实际编译的内容?
或者,是否有一个更简单,理智的方法解决这个问题?
python ×3
c# ×1
c#-4.0 ×1
c++ ×1
coding-style ×1
generics ×1
iphone ×1
java ×1
javascript ×1
list ×1
objective-c ×1
performance ×1
php ×1
polymorphism ×1
this ×1
typing ×1