GVKun编程网logo

为什么在 Pylint 认为不正确的条件值中使用 len(SEQUENCE)?

4

如果您想了解为什么在Pylint认为不正确的条件值中使用len(SEQUENCE)?的相关知识,那么本文是一篇不可错过的文章,我们将为您提供关于@SequenceGenerator注释中的sequen

如果您想了解为什么在 Pylint 认为不正确的条件值中使用 len(SEQUENCE)?的相关知识,那么本文是一篇不可错过的文章,我们将为您提供关于@SequenceGenerator 注释中的 sequenceName 是什么,它是如何工作的?、A Paper A Day: #1 Convolutional Sequence to Sequence Learning、c# – 为什么Interlocked.Increment在Parallel.ForEach循环中给出不正确的结果?、com.intellij.util.text.CharSequenceSubSequence的实例源码的有价值的信息。

本文目录一览:

为什么在 Pylint 认为不正确的条件值中使用 len(SEQUENCE)?

为什么在 Pylint 认为不正确的条件值中使用 len(SEQUENCE)?

考虑到这个代码片段:

from os import walkfiles = []for (dirpath, _, filenames) in walk(mydir):    # More code that modifies filesif len(files) == 0: # <-- C1801    return None

Pylint 对这条关于 if 语句行的消息感到震惊:

[pylint] C1801:不要len(SEQUENCE)用作条件值

乍一看,规则 C1801
对我来说听起来不是很合理,参考指南上的定义也没有解释为什么这是一个问题。事实上,它彻头彻尾地称之为
不正确的使用

len-as-condition (C1801)不用len(SEQUENCE)作条件值 当 Pylint 检测到条件内不正确使用
len(sequence) 时使用。

我的搜索尝试也未能为我提供更深入的解释。我确实理解序列的长度属性可能会被延迟评估,并且__len__可以对其进行编程以产生副作用,但值得怀疑的是,仅此一项是否足以让
Pylint 称这种用法不正确。因此,在我简单地配置我的项目以忽略该规则之前,我想知道我是否在推理中遗漏了一些东西。

什么时候使用len(SEQ)作为条件值有问题?Pylint 试图通过 C1801 避免哪些主要情况?

答案1

小编典典

什么时候使用len(SEQ)作为条件值有问题?Pylint 试图通过 C1801 避免哪些主要情况?

使用起来并没有 真正 的问题——len(SEQUENCE)尽管它可能效率不高。无论如何,Pylint 检查代码是否符合PEP 8风格指南,该指南指出

对于序列(字符串、列表、元组),使用空序列为假的事实。

**Yes:** if not seq:     if seq:**No:**  if len(seq):     if not len(seq):

作为一个偶尔在语言之间来回穿梭的 Python
程序员,我认为该len(SEQUENCE)结构更具可读性和显式(“显式优于隐式”)。然而,在布尔上下文中使用空序列求值的事实False被认为更“ythonic”。

@SequenceGenerator 注释中的 sequenceName 是什么,它是如何工作的?

@SequenceGenerator 注释中的 sequenceName 是什么,它是如何工作的?

如何解决@SequenceGenerator 注释中的 sequenceName 是什么,它是如何工作的??

这是来自另一个 stackoverflow 答案的引用:

sequenceName 是数据库中序列的名称。这就是你的方式 指定一个已经存在于数据库中的序列

我不太明白“指定数据库中已经存在的序列”是什么,所以有几个问题:

  1. 我正在创建一个新序列,它怎么可能已经存在于数据库中?
  2. 这只是序列在 DB 中保存方式的名称吗?
  3. 如果未指定 sequenceName,Hibernate 会使用什么?

附言我确实理解这些问题是多么愚蠢。

解决方法

  1. 如果您使用 Hibernate 创建架构,那么您只是在创建一个新序列。这由 hibernate.hbm2ddl.auto 属性或 javax.persistence.schema-generation 属性系列控制。

  2. 它回退到序列的默认命名约定。

如果你的表自动生成了id,那么你就不需要直接定义序列了。您可以只使用注释 @GeneratedValue(strategy = GenerationType.IDENTITY)。这不仅降低了您的代码复杂性,而且现在每次插入都将进行一次查询而不是两次查询。

A Paper A Day: #1 Convolutional Sequence to Sequence Learning

A Paper A Day: #1 Convolutional Sequence to Sequence Learning

从今天开始,我会对一些研究论文做一个简短的摘要,我个人比较关注的领域是机器学习,强化学习和自然语言处理。我希望这个简短的摘要可以帮助到你。当然,我也有别的目的。我希望我能通过每天的阅读,可以帮助我提高论文写作和分析能力。

今天,我们来讨论一下最近的 Facebook AI research(FAIR)那篇卷积序列学习论文。以下是阅读本文的主要观点:

主要成果

  1. 对于机器翻译任务,卷积神经网络也能取得比较好的效果。

  2. 与循环神经网络相比,卷积神经网络具有高度并行性。因此,机器翻译系统可以做的更快。作者在性能上面提高了 9 倍。

  3. 多跳机制:网络不是一个句子一个句子看,而是多个句子一起看,这样才能产生更好的翻译。

为什么选择 CNN 而不是 RNN?

速度和可扩展性!

实验结果

  1. 在 WMT''16 英语 - 罗马尼亚语的翻译中取得最先进的结果,超过以前的最佳结果 1.8 BLEU。

  2. 在 WMT''14 英语 - 德语翻译中,结果比强大的 LSTM (Wu et al.(2016))还要好。

  3. 此外,作者说他的翻译速度提升了 9 倍。

代码

完整代码请点击这里。


c# – 为什么Interlocked.Increment在Parallel.ForEach循环中给出不正确的结果?

c# – 为什么Interlocked.Increment在Parallel.ForEach循环中给出不正确的结果?

我有一个迁移作业,我需要在完成后验证目标数据.要通知管理员验证的成功/失败,我使用计数器来比较 Database1中表Foo的行数与Database2中表Foo的行数.

Database2中的每一行都针对Database1中的相应行进行验证.为了加快进程,我使用Parallel.ForEach循环.

我最初的问题是,这个计数总是与我预想的不同.我后来发现,=和 – =操作不是线程安全的(不是原子的).为了纠正这个问题,我更新了使用Interlocked.Increment的代码来计数变量.这个代码打印一个更接近实际计数的计数,但仍然在每次执行时似乎都有所不同,它没有给出我预期的结果:

Private countObjects As Integer

Private Sub MyMainFunction()
    Dim objects As List(Of MyObject)

    'Query with Dapper,unrelevant to the problem.
    Using connection As New System.Data.sqlClient.sqlConnection("aConnectionString")
        objects = connection.Query("SELECT * FROM Foo") 'Returns around 81000 rows.
    End Using

    Parallel.ForEach(objects,Sub(u) MyParallelFunction(u))

    Console.WriteLine(String.Format("Count : {0}",countObjects)) 'Prints "Count : 80035" or another incorrect count,which seems to differ on each execution of MyMainFunction.
End Sub

Private Sub MyParallelFunction(obj As MyObject)
    Interlocked.Increment(countObjects) 'Breakpoint Hit Count is at around 81300 or another incorrect number when done.

    'Continues executing unrelated code using obj...
End Sub

在使用其他增加线程安全性的方法进行了一些实验之后,我发现将虚拟参考对象上的SyncLock中的增量包装起来会给出预期的结果:

Private countObjects As Integer
Private locker As SomeType

Private Sub MyMainFunction()
    locker = New SomeType()
    Dim objects As List(Of MyObject)

    'Query with Dapper,countObjects)) 'Prints "Count : 81000".
End Sub

Private Sub MyParallelFunction(obj As MyObject)
    SyncLock locker
        countObjects += 1 'Breakpoint Hit Count is 81000 when done.
    End SyncLock

    'Continues executing unrelated code using obj...
End Sub

为什么第一个代码段不按预期工作?最令人困惑的是断点命中计数提供意想不到的结果.

我对Interlocked.Increment或原子操作的理解有缺陷吗?我不想在一个虚拟对象上使用SyncLock,我希望有一个干净的方法.

更新:

>我在任何cpu上运行Debug模式下的示例.
>我在堆栈中使用ThreadPool.SetMaxThreads(60,60),因为我在某个时候查询Access数据库.这可能会造成问题吗?
>可以调用Increment混合Parallel.ForEach循环,强制它在所有任务完成之前退出?

更新2(方法):

>我的测试执行的代码尽可能接近这里显示的内容,除了对象类型和查询字符串.
>查询总是给出相同数量的结果,我总是验证objects.Count在断点上继续Parallel.ForEach.
>在执行之间更改的唯一代码是Interlocked.Increment替换为SyncLock locker和countObjects = 1.

更新3

我通过在新的控制台应用程序中复制我的代码并替换外部类和代码来创建了一个SSCCE.

这是控制台应用程序的主要方法:

Sub Main()
    Dim oClass1 As New Class1
    oClass1.MyMainFunction()
End Sub

这是Class1的定义:

Imports System.Threading

Public Class Class1

    Public Class Dummy
        Public Sub New()
        End Sub
    End Class

    Public Class MyObject
        Public Property Id As Integer

        Public Sub New(p_Id As Integer)
            Id = p_Id
        End Sub
    End Class

    Public Property countObjects As Integer
    Private locker As Dummy

    Public Sub MyMainFunction()
        locker = New Dummy()
        Dim objects As New List(Of MyObject)

        For i As Integer = 1 To 81000
            objects.Add(New MyObject(i))
        Next

        Parallel.ForEach(objects,Sub(u As MyObject)
                                      MyParallelFunction(u)
                                  End Sub)

        Console.WriteLine(String.Format("Count : {0}",countObjects)) 'Interlock prints an incorrect count,different in each execution. SyncLock prints the correct count.
        Console.ReadLine()
    End Sub

    'Interlocked
    Private Sub MyParallelFunction(ByVal obj As MyObject)
        Interlocked.Increment(countObjects)
    End Sub

    'SyncLock
    'Private Sub MyParallelFunction(ByVal obj As MyObject)
    '    SyncLock locker
    '        countObjects += 1
    '    End SyncLock
    'End Sub

End Class

将MyParallelFunction从Interlocked.Increment切换到SyncLock时,我仍然注意到相同的行为.

解决方法

一个财产的增值将永远被打破.有效地,VB编译器将其重写为:
Value = <value from Property>
Interlocked.Increment(Value)
<Property> = Value

因此打破了Increment提供的任何线程保证.将其更改为字段. VB将重写任何作为ByRef参数传递的属性到类似于上述的代码.

com.intellij.util.text.CharSequenceSubSequence的实例源码

com.intellij.util.text.CharSequenceSubSequence的实例源码

项目:intellij-ce-playground    文件:EditorTextFieldCellRenderer.java   
private static void appendAbbreviated(StringBuilder to,String text,int start,int end,FontMetrics metrics,int maxWidth,boolean replaceLineTerminators) {
  int abbreviationLength = abbreviationLength(text,start,end,metrics,maxWidth,replaceLineTerminators);

  if (!replaceLineTerminators) {
    to.append(text,start + abbreviationLength);
  }
  else {
    CharSequenceSubSequence subSeq = new CharSequenceSubSequence(text,start + abbreviationLength);
    for (Linetokenizer lt = new Linetokenizer(subSeq); !lt.atEnd(); lt.advance()) {
      to.append(subSeq,lt.getoffset(),lt.getoffset() + lt.getLength());
      if (lt.getLineseparatorLength() > 0) {
        to.append(RETURN_SYMBOL);
      }
    }
  }

  if (abbreviationLength != end - start) {
    to.append(ABBREVIATION_SUFFIX);
  }
}
项目:intellij-ce-playground    文件:EditorTextFieldCellRenderer.java   
private static int abbreviationLength(String text,boolean replaceSeparators) {
  if (metrics.charWidth('m') * (end - start) <= maxWidth) return end - start;

  int abbrWidth = metrics.charWidth(ABBREVIATION_SUFFIX);
  int abbrLength = 0;

  CharSequenceSubSequence subSeq = new CharSequenceSubSequence(text,end);
  for (Linetokenizer lt = new Linetokenizer(subSeq); !lt.atEnd(); lt.advance()) {
    for (int i = 0; i < lt.getLength(); i++,abbrLength++) {
      abbrWidth += metrics.charWidth(subSeq.charat(lt.getoffset() + i));
      if (abbrWidth >= maxWidth) return abbrLength;
    }
    if (replaceSeparators && lt.getLineseparatorLength() != 0) {
      abbrWidth += metrics.charWidth(RETURN_SYMBOL);
      if (abbrWidth >= maxWidth) return abbrLength;
      abbrLength += lt.getLineseparatorLength();
    }
  }

  return abbrLength;
}
项目:consulo    文件:EditorTextFieldCellRenderer.java   
private static void appendAbbreviated(StringBuilder to,lt.getoffset() + lt.getLength());
      if (lt.getLineseparatorLength() > 0) {
        to.append(RETURN_SYMBOL);
      }
    }
  }

  if (abbreviationLength != end - start) {
    to.append(ABBREVIATION_SUFFIX);
  }
}
项目:consulo    文件:EditorTextFieldCellRenderer.java   
private static int abbreviationLength(String text,abbrLength++) {
      abbrWidth += metrics.charWidth(subSeq.charat(lt.getoffset() + i));
      if (abbrWidth >= maxWidth) return abbrLength;
    }
    if (replaceSeparators && lt.getLineseparatorLength() != 0) {
      abbrWidth += metrics.charWidth(RETURN_SYMBOL);
      if (abbrWidth >= maxWidth) return abbrLength;
      abbrLength += lt.getLineseparatorLength();
    }
  }

  return abbrLength;
}
项目:intellij-ce-playground    文件:IndexPatternSearcher.java   
private static boolean collectPatternMatches(IndexPattern indexPattern,CharSequence chars,int commentStart,int commentEnd,PsiFile file,TextRange range,Processor<IndexPatternOccurrence> consumer,TIntArrayList matches
                                             ) {
  Pattern pattern = indexPattern.getPattern();
  if (pattern != null) {
    ProgressManager.checkCanceled();

    CharSequence input = new CharSequenceSubSequence(chars,commentStart,commentEnd);
    Matcher matcher = pattern.matcher(input);
    while (true) {
      //long time1 = System.currentTimeMillis();
      boolean found = matcher.find();
      //long time2 = System.currentTimeMillis();
      //System.out.println("scanned text of length " + (lexer.getTokenEnd() - lexer.getTokenStart() + " in " + (time2 - time1) + " ms"));

      if (!found) break;
      int start = matcher.start() + commentStart;
      int end = matcher.end() + commentStart;
      if (start != end) {
        if ((range == null || range.getStartOffset() <= start && end <= range.getEndOffset()) && matches.indexOf(start) == -1) {
          matches.add(start);
          if (!consumer.process(new IndexPatternOccurrenceImpl(file,indexPattern))) {
            return false;
          }
        }
      }

      ProgressManager.checkCanceled();
    }
  }
  return true;
}
项目:intellij-ce-playground    文件:LexerEditorHighlighterLexer.java   
@Override
public void start(@NotNull CharSequence buffer,int startOffset,int endOffset,int state) {
  if (myAlreadyInitializedHighlighter) {
    this.buffer = buffer;
    start = startOffset;
    end = endOffset;
  } else {
    myHighlighter.setText(new CharSequenceSubSequence(this.buffer = buffer,start = startOffset,end = endOffset));
  }
  iterator = myHighlighter.createIterator(0);
}
项目:tools-idea    文件:LexerEditorHighlighterLexer.java   
@Override
public void start(CharSequence buffer,end = endOffset));
  }
  iterator = myHighlighter.createIterator(0);
}
项目:tools-idea    文件:IndexPatternSearcher.java   
private static boolean collectPatternMatches(IndexPattern indexPattern,Processor<IndexPatternOccurrence> consumer) {
  Pattern pattern = indexPattern.getPattern();
  if (pattern != null) {
    ProgressManager.checkCanceled();

    CharSequence input = new CharSequenceSubSequence(chars,commentEnd);
    Matcher matcher = pattern.matcher(input);
    while (true) {
      //long time1 = System.currentTimeMillis();
      boolean found = matcher.find();
      //long time2 = System.currentTimeMillis();
      //System.out.println("scanned text of length " + (lexer.getTokenEnd() - lexer.getTokenStart() + " in " + (time2 - time1) + " ms"));

      if (!found) break;
      int start = matcher.start() + commentStart;
      int end = matcher.end() + commentStart;
      if (start != end) {
        if (range == null || range.getStartOffset() <= start && end <= range.getEndOffset()) {
          if (!consumer.process(new IndexPatternOccurrenceImpl(file,indexPattern))) {
            return false;
          }
        }
      }

      ProgressManager.checkCanceled();
    }
  }
  return true;
}
项目:consulo    文件:IndexPatternSearcher.java   
private static boolean collectPatternMatches(IndexPattern indexPattern,indexPattern))) {
            return false;
          }
        }
      }

      ProgressManager.checkCanceled();
    }
  }
  return true;
}
项目:consulo    文件:LexerEditorHighlighterLexer.java   
@Override
public void start(@Nonnull CharSequence buffer,end = endOffset));
  }
  iterator = myHighlighter.createIterator(0);
}
项目:consulo    文件:PsiFileFactoryImpl.java   
@Override
public PsiFile createFileFromText(FileType fileType,final String fileName,int endOffset) {
  LOG.assertTrue(!fileType.isBinary());
  final CharSequence text =
    startOffset == 0 && endOffset == chars.length() ? chars : new CharSequenceSubSequence(chars,startOffset,endOffset);
  return createFileFromText(fileName,fileType,text);
}
项目:consulo-java    文件:LexerEditorHighlighterLexer.java   
@Override
public void start(CharSequence buffer,end = endOffset));
  }
  iterator = myHighlighter.createIterator(0);
}
项目:intellij-ce-playground    文件:PsiFileFactoryImpl.java   
@Override
public PsiFile createFileFromText(FileType fileType,int endOffset) {
  LOG.assertTrue(!fileType.isBinary());
  final CharSequence text = startOffset == 0 && endOffset == chars.length()?chars:new CharSequenceSubSequence(chars,text);
}
项目:tools-idea    文件:CharTableImpl.java   
@NotNull
@Override
public CharSequence intern(@NotNull final CharSequence baseText,final int startOffset,final int endOffset) {
  if (endOffset - startOffset == baseText.length()) return baseText;
  return intern(new CharSequenceSubSequence(baseText,endOffset));
}
项目:tools-idea    文件:PsiFileFactoryImpl.java   
@Override
public PsiFile createFileFromText(FileType fileType,text);
}

关于为什么在 Pylint 认为不正确的条件值中使用 len(SEQUENCE)?的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于@SequenceGenerator 注释中的 sequenceName 是什么,它是如何工作的?、A Paper A Day: #1 Convolutional Sequence to Sequence Learning、c# – 为什么Interlocked.Increment在Parallel.ForEach循环中给出不正确的结果?、com.intellij.util.text.CharSequenceSubSequence的实例源码的相关知识,请在本站寻找。

本文标签: