小编use*_*082的帖子

为什么实现 __iter__ 的对象不被识别为可迭代的?

假设您使用包装器对象:

class IterOrNotIter:
    def __init__(self):
        self.f = open('/tmp/toto.txt')
    def __getattr__(self, item):
        try:
            return self.__getattribute__(item)
        except AttributeError:
            return self.f.__getattribute__(item)
Run Code Online (Sandbox Code Playgroud)

此对象实现__iter__,因为它将对它的任何调用传递给实现它的成员f。案例:

>>> x = IterOrNotIter()
>>> x.__iter__().__next__()
'Whatever was in /tmp/toto.txt\n'
Run Code Online (Sandbox Code Playgroud)

根据文档(https://docs.python.org/3/library/stdtypes.html#iterator-types),因此 IterOrNotIter 应该是可迭代的。

但是,Python 解释器不会将IterOrNotIter对象识别为实际上是可迭代的:

>>> x = IterOrNotIter()
>>> for l in x:
...    print(l)
...
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'IterOrNotIter' object is not iterable
Run Code Online (Sandbox Code Playgroud)

而这有效:

>>> x = IterOrNotIter()
>>> for l in …
Run Code Online (Sandbox Code Playgroud)

python iterable python-3.x

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

两个过滤器由Linux上的两个命名管道(FIFO)循环链接

我想让两个进程通过Linux上的两个命名管道相互通信.每个进程都是一个Unix过滤器:它读取标准输入的数据并在其标准输出上写入数据.它们是循环链接的,第一个的输出是第二个的输入,反之亦然.

这是第一个过滤器(ac)的代码:

#include <stdio.h>

int main( void  ){
  FILE* ferr = fopen( "/dev/stderr", "w" );
  double d;

  fprintf(ferr,"A is going to write\n");
  printf("%lf\n",1.);
  fprintf(ferr,"A wrote %lf\n",1.);

  while( 1 ){
    fprintf(ferr,"A is going to read\n");
    if( scanf("%lf",&d) == EOF ){
      break;
    }
    fprintf(ferr,"A recieved : %lf\n",d);
    d += 1;
    fprintf(ferr,"A is going to write\n");
    printf("%lf\n",d);
    fprintf(ferr,"A wrote %lf\n",d);
  }
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是第二个过滤器的代码(bc):

#include <stdio.h>

int main( void  ){
  FILE* ferr = fopen( "/dev/stderr", "w" );
  double d;

  while( 1 ){ …
Run Code Online (Sandbox Code Playgroud)

c linux named-pipes fifo cat

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

标签 统计

c ×1

cat ×1

fifo ×1

iterable ×1

linux ×1

named-pipes ×1

python ×1

python-3.x ×1