标签: dynamic-typing

在Python中强制/转换为正确类型的最佳位置

我仍然是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 dynamic-typing

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

动态类型设计:处理列表的递归性是一个好的设计吗?

缺乏维护动态类型代码的经验,我正在寻找处理这种情况的最佳方法:

(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中有成语吗?提前致谢.

python coding-style list dynamic-typing

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

动态选择不同的viewControllers

我有一个问题,我认为可能是直截了当但我似乎无法绕过它.

我有一个从一系列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)

iphone objective-c dynamic-typing uiviewcontroller

0
推荐指数
1
解决办法
330
查看次数

JavaScript动态类型int/float

以下是否正确?为什么?

x = 7;
y = 7.00;
z = x + y;
console.log(z);
Run Code Online (Sandbox Code Playgroud)

结果:

14

我希望日志结果为"14.00".

javascript dynamic-typing

0
推荐指数
1
解决办法
61
查看次数

在C++,PHP,其他语言中使用它

为什么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++在没有这个要求的情况下管理得很好...

php c++ static-typing this dynamic-typing

0
推荐指数
1
解决办法
53
查看次数

使用int()声明整数变量时为什么Python工作得更快?

在编写仅使用整数运算的算法时,我注意到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文档中获得一些解释它的参考.

python performance typing dynamic-typing

0
推荐指数
1
解决办法
216
查看次数

接受包含特定方法的对象,而不是接受特定类型

[编辑]:这个问题与我无法控制的类型有关。因此,使它们无法继承超类或实现接口是不可能的。我希望能够做到这一点而无需包装类型。

我想编写一个方法,将包含特定方法的所有对象接受为参数。

例如,我们有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)

java generics polymorphism dynamic-typing

0
推荐指数
1
解决办法
28
查看次数

如何在运行时创建一系列编号变量?

朋友们,我必须创建一系列ArrayLists,每个包含未知来源的对象,每个实例都分配给一个单独的局部变量.

到目前为止,这么好......但我还需要每个局部变量的名称遵循一个非常具体的模式:名称应以"oArr"开头,后跟一个或多个数字反映特定数组在序列中的位置.此外,我不会在编译时知道有多少这些数组 - 因此,我需要多少局部变量!

令我感到震惊的是,这可能是一个问题,可以通过C#4.0中动态类型的可用性来解决,但我对它们的使用并不熟悉.我怎么能拿这样的代码......

int i=0;
foreach(something)
{
    ArrayList oArr+i=new ArrayList();
    i++;
}
Run Code Online (Sandbox Code Playgroud)

...并将其转换为符合上述标准实际编译的内容?

或者,是否有一个更简单,理智的方法解决这个问题?

c# dynamic-typing dynamic-keyword c#-4.0

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